2

在以下代码中,我想使用整数作为字典中的键:

import itertools  
N = {}
for a,b,c,d in itertools.product(range(100), repeat=4):
    x = a*a + c*c
    y = a*b + c*d
    z = b*b + d*d
    s = x + y + y + z
    N[s] += 1 
print N

我得到一个KeyError: 0at N[s] += 1。为什么会这样?文件说_

字符串和数字总是可以作为键

wiki给出了解释:KeyError

每当请求 dict() 对象(使用 format a = adict[key])并且键不在字典中时,Python 都会引发 KeyError。

我想做的是用未知的键构建一个字典(它们是动态计算的)并为它们保留一个计数器。我过去做过(用字符串作为键)所以这次我做错了什么?(我知道 - 这一定非常明显,但是在盯着这个复杂的代码一段时间后,我需要帮助 :))

4

3 回答 3

3

利用defaultdict

import itertools
from collections import defaultdict
N = defaultdict(int)
for a,b,c,d in itertools.product(range(100), repeat=4):
    x = a*a + c*c
    y = a*b + c*d
    z = b*b + d*d
    s = x + y + y + z
    N[s] += 1 
print N

# answer is too long to include here
于 2013-10-08T07:52:38.910 回答
1

Counter最好,因为它有分析结果的方法,但您也可以使用defaultdict

from collections import defaultdict
N = defaultdict(int)

如果键不存在,则该值将被初始化为 的默认值int,即 0。

于 2013-10-08T07:53:06.617 回答
1

在您的第一次迭代中,N是空的,但是您正在尝试访问N[0]

您可以使用以下方法解决此特定问题

if s in N:
    N[s] += 1
else:
    N[s] = 0 # or 1 or whatever

但正如@monkut 在评论中所说,您应该使用Counter

于 2013-10-08T07:33:06.147 回答