【问题标题】:Why KeyError: 0为什么KeyError:0
【发布时间】:2014-05-31 07:54:34
【问题描述】:

我正在尝试解决 Project Euler 21 但我得到 KeyError: 0 当您引用不存在的字典键时通常会发生这种情况。但是,我认为我已经用

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())

有什么想法吗?

【问题讨论】:

  • 如果sumdivs[i] 为0,sumsdivs[sumsdivs[i]] 可能会抛出异常。
  • @MartijnPieters 这不可能。要在sumsdivs 中有一个0tmpls 必须是一个空列表,但它始终包含1,因为每个range(1, n) 列表都包含1n % 1 == 0
  • @Haidro: sumsdivs[1]0
  • 好点,现在正在检查...
  • @MartijnPieters 啊,我明白了。 range(1, 1)[],而不是 [1]

标签: python python-3.x keyerror


【解决方案1】:

您在此处插入0i = 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2018-05-01
    • 2020-03-19
    • 1970-01-01
    • 2018-03-16
    相关资源
    最近更新 更多