在字典中如何将键*值相乘?

5
a = {2: 4, 3: 2, 5: 1, 7: 1}

这个字典的键表示质数,值表示计数器。我想通过迭代字典键*值并求和来计算您所得到的数字。什么是最Pythonic的方法?

>>> [k*v for k,v in a.items()]
[8, 6, 5, 7]

但是
>>> sum(k*v for k,v in a.items())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable

你遍历(键,值)元组的一般方式是使用 yourDict.items() - ninjagecko
2个回答

7
这样做:
sum(k*v for k,v in a.items())

或使用语义化命名:

sum(p*c for p,c in primesToCounts.items())

@Chris:a 应该是你的字典。例如,在你的问题中,你说 a = {2: 4, 3: 2, 5: 1, 7: 1}。我不相信你会以同样的方式调用这两件事。这种方法在python2和python3中都适用。如果你发现你仍然有上面的错误,请在你的解释器中输入 a ,你会发现一些愚蠢的东西,比如 a==5 - ninjagecko
3
您的问题在于定义了一个名为 sum 的变量,这个变量覆盖了内置函数 sum。请在当前解释器中输入 sum:返回结果可能是 23 或其它数值。现在在一个新的解释器中输入 sum:返回结果应该是 <function ...>。您很可能想要执行 23(k*v for k,v in a.items()) - ninjagecko
你是正确的。哎呀...学到了宝贵的教训。谢谢你。 - Chris

3
怎么样:
>>> a = {2: 4, 3: 2, 5: 1, 7: 1}
>>> [key * val for key, val in a.items()]
... [8, 6, 5, 7]
>>> sum([key * val for key, val in a.items()])
... 26

那相当符合Python的风格。

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