为什么会出现KeyError: 0

3 投票
1 回答
67943 浏览
提问于 2025-04-18 08:07

我正在尝试解决Project Euler的第21题,但遇到了一个KeyError: 0的错误。这种错误通常发生在你试图访问一个字典中不存在的键时。不过,我以为我通过设置< 10000的条件解决了这个问题。这个错误出现在main()函数中的第一个'if'语句。

sumsdivs = {}
for i in range(1, 10000):
    tmpls = []
    for j in range(1, i):
        if i % j == 0:
            tmpls.append(j)
    sumsdivs[i] = sum(tmpls)

amls = []
def main():
    for i in range(1, 10000):
        if sumsdivs[i] < 10000 and sumsdivs[i] == sumsdivs[sumsdivs[i]]:
            if sumsdivs[i] not in amls:
                amls.append(sumsdivs[i])
            if sumsdivs[sumsdivs[i]] not in amls:
                amls.append(sumsdivs[sumsdivs[i]])
    return sum(amls)

print(main())

有什么想法吗?

1 个回答

7

你在这里把 0 插入到 i = 1 的位置:

sumsdivs = {}
for i in range(1, 10000):
    tmpls = []
    for j in range(1, i):
        if i % j == 0:
            tmpls.append(j)
    sumsdivs[i] = sum(tmpls)

里面的循环根本没执行(因为 range(1, 1) 是空的),所以 sum([]) 的结果是 0。

示例:

>>> sumsdivs = {}
>>> for i in range(1, 2):
...     tmpls = []
...     for j in range(1, i):
...         if i % j == 0:
...             tmpls.append(j)
...     sumsdivs[i] = sum(tmpls)
... 
>>> sumsdivs
{1: 0}
>>> sum([])
0    

因此 sumsdivs[1] 的值是 0,而 sumsdivs[sumsdivs[0]] 会出现一个 KeyError 错误:

>>> sumsdivs[sumsdivs[1]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 0

撰写回答