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


239

假设我有一本字典,其中的键映射为整数,例如:

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

是否有返回值的总和在语法上简约的方式d-即62在这种情况下?


2
只是为了好玩:sumreduce- reduce来实现自己是一种更通用的形式(例如summin并且max都可以用来表示reduce),并且可以product轻松解决其他问题(例如)。

1
Guido的话-我想我没记错-减少了吗?我和你在一起。为什么要从语言中删除它?
octopusgrabbus 2012年

Answers:


471

如您所料:

sum(d.values())

1
好吧,它Python 2.7.12也可以与sum(d.values())
LancelotHolmes

7
@LancelotHolmes是的,但是那会在内存中建立一个列表,因此可能会较慢/接近大型词典的资源限制。因此,在讨论Python 2时,此答案表示“您可能要使用”而不是“ 必须使用”
。– phihag

真好!我之所以找到它,只是因为我知道会有类似的事情。并不是说写一个死的傻傻的for循环就需要太多的工作;)
runlevel0

我不知道您是否喜欢python,是否喜欢python 3或真的是在指python 2
Lucas Vazquez

1
@LucasVazquez这指的是Python 2(或1)。我删除了它,因为它已经不相关了-即使您使用Python2编写新代码,也可以使用d.values()
phihag

70

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

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))

这本质上就是本杰明·彼得森的six模块所做的。


5
是啊,虽然这并不适用于蟒蛇3
tokland

15

当然可以。这是一种汇总字典值的方法。

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


3

我觉得这sum(d.values())是获得总和的最有效方法。

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

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


0

phihag的答案(和类似的答案)在python3中不起作用。

对于python 3:

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

更新!有人抱怨说这行不通!我只是在终端上附上截图。可能是版本不匹配等。

在此处输入图片说明


即使我们尝试这种方式,也存在相同的问题
jeevan kishore

它对我来说很好!我用屏幕截图更新了答案(无法在此处完成);它可能与版本有关...
Reza


-1

您可以获取字典中所有值的生成器,然后将其转换为列表,然后使用sum()函数获取所有值的总和。

例:

c={"a":123,"b":4,"d":4,"c":-1001,"x":2002,"y":1001}

sum(list(c.values()))

1
如果不起作用,这是一个答案。看起来更像是对其他答案的评论。
马丁·托格森(MartinThøgersen)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.