【问题标题】:how to use an integer as a key in python?如何在python中使用整数作为键?
【发布时间】:2013-10-08 07:30:05
【问题描述】:

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

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。为什么会这样? documentation 表示

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

KeyError 上的wiki gives an explanation

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

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

【问题讨论】:

  • 您的密钥未定义,因此您收到错误消息。 (你不能给不存在的东西加 1)。您可能想使用Counterfrom collections import Counter; N = Counter()
  • 谢谢 - 我关注的是键的存在而不是值。
  • 作为对习惯于 StackOverflow 哲学的人的一个附带问题:为什么这样的问题会被否决? (我理解反对票的概念,我想知道为什么这个问题不合适)
  • 你的问题很好。您提供了实际代码,列出了您收到的错误并进行了尝试并破译了错误。如果人们不喜欢您的问题,他们应该就原因发表评论。

标签: python dictionary


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    你可以解决这个特殊的问题

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

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

    【讨论】:

    • 谢谢 - 我不知道 Counter,它确实简化了代码。
    【解决方案3】:

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

    from collections import defaultdict
    N = defaultdict(int)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      相关资源
      最近更新 更多