如何在Python中将整数用作键?

3
在以下代码中,我想使用整数作为字典的键:
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

我在N[s] += 1时得到了一个KeyError: 0错误,为什么会这样呢?文档说:

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

维基百科KeyError进行了解释:

当请求一个dict()对象(使用格式a = adict[key])中不存在的键时,Python会引发KeyError异常。

我的目标是构建一个带有未知键的字典(它们是即时计算出来的),并保持其计数器。我以前做过类似的事情(使用字符串作为键),所以这一次我做错了什么?(我知道 - 这一定是非常明显的,但在盯着这个复杂的代码一段时间后,我需要帮助 :))


3
你的密钥未定义,因此会出现错误。(你无法对不存在的东西加1)。你可能想使用“Counter”,导入方法为“from collections import Counter; N = Counter()”。 - monkut
谢谢 - 我关注的是键的存在而不是值。 - WoJ
作为对StackOverflow哲学的一个附加问题:为什么这样一个问题会被踩?(我理解downvote的概念,我想知道为什么这个问题不合适) - WoJ
你的问题很好。你提供了实际的代码,列出了你收到的错误,并尝试解读这个错误。如果有人不喜欢你的问题,他们应该留下评论说明原因。 - Mark Tolonen
3个回答

4

使用 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

1
在你的第一次迭代中,N是空的,但是你试图访问N[0]
你可以通过以下方式解决这个特定的问题。
if s in N:
    N[s] += 1
else:
    N[s] = 0 # or 1 or whatever

但是正如@monkut在评论中所说,您应该使用计数器


谢谢 - 我不知道Counter,它确实简化了代码。 - WoJ

1

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

from collections import defaultdict
N = defaultdict(int)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接