如何对字典中所有值进行求和?

363

假设我有一个字典,其中键(key)映射到整数:

d = {'key1': 1,'key2': 14,'key3': 47}

有没有一种语法上简约的方法来返回d中值的总和,即在此例中为62


2
只是为了好玩:使用reduce实现sum -- reduce是一种更通用的形式(例如,summinmax都可以用reduce来编写),并且可以轻松解决其他问题(例如,product)。 - user166390
1
Guido说过什么,我想我记得没错,reduce 要被移除了?我同意你的想法。为什么要从语言中删除它呢? - octopusgrabbus
11个回答

713

正如你所期望的:

sum(d.values())

1
好的,Python 2.7.12也可以很好地使用sum(d.values()) - LancelotHolmes
7
是的,但这会在内存中建立一个列表,因此对于大型字典来说,速度较慢/接近资源限制,因此当讨论Python 2时,该回答建议使用"你可能想使用"而不是"你必须使用"。 - phihag
不错!我查找它只是因为我知道会有类似的东西。虽然编写一个死循环并不需要太多工作 ;) - runlevel0
我不知道你是否喜欢Python,如果你喜欢Python 3,还是真的在指Python 2。 - Lucas Vazquez
1
@LucasVazquez 这是指Python 2(或1)。由于现在不相关,我已将其删除 - 即使您在Python2中编写新代码,也可以使用d.values() - phihag

72

在Python2中,你可以通过使用itervalues()字典方法来避免创建所有值的临时副本,该方法返回字典键的一个迭代器:

sum(d.itervalues())
在Python 3中,您可以直接使用d.values(),因为该方法已更改以执行此操作(并且itervalues()已被删除,因为它不再需要)。
为了更轻松地编写版本无关的代码,始终迭代字典键的值,一个实用函数可能会有所帮助。
import sys

def itervalues(d):
    return iter(getattr(d, ('itervalues', 'values')[sys.version_info[0]>2])())

sum(itervalues(d))

这基本上就是 Benjamin Peterson 的 six 模块所做的。


5
是的,尽管这不适用于Python 3。 - tokland

20

当然有方法。这里是一种计算字典值总和的方式。

>>> d = {'key1':1,'key2':14,'key3':47}
>>> sum(d.values())
62

9
d = {'key1': 1,'key2': 14,'key3': 47}
sum1 = sum(d[item] for item in d)
print(sum1)

你可以使用for循环来完成它


8

sum(d.values())

  • "d" -> 你的字典变量

5

我认为sum(d.values())是获取总和的最有效方法。

你也可以尝试使用reduce函数和lambda表达式来计算总和:

reduce(lambda x,y:x+y,d.values())

4

使用sum()函数对字典中的值进行求和。

调用dict.values()函数返回字典dict中的值。使用sum(values)函数计算前一步骤中的值的总和。

d = {'key1':1,'key2':14,'key3':47}
values = d.values()
#Return values of a dictionary    
total = sum(values)
print(total)

3

phihag的答案(以及类似的答案)在Python3中不起作用。

针对Python 3:

d = {'key1': 1,'key2': 14,'key3': 47}
sum(list(d.values()))

更新!有人抱怨它不起作用!我刚刚从我的终端附上了一张截图。可能是版本之间的某些不匹配。

在此输入图片描述


即使我们尝试这种方式,仍然存在相同的问题。 - jeevan kishore
对我来说,它运行良好!我用一张截图更新了我的答案(此处无法执行),这可能与版本有关... - Reza

0

0
你可以考虑使用“for循环”来实现这个功能:
  d = {'data': 100, 'data2': 200, 'data3': 500}
  total = 0
  for i in d.values():
        total += i

总数 = 800


1
或者只需使用sum(d.values()),因为.values()返回的是一个List - Linny
是的,那也是另一种方式。 - Rahul Patel

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