为什么会出现KeyError: 0
我正在尝试解决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