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

Posted

技术标签:

【中文标题】如何对字典中的所有值求和?【英文标题】:How to sum all the values in a dictionary? 【发布时间】:2011-06-20 08:08:24 【问题描述】:

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

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

是否有一种语法上最简单的方法来返回 d 中的值的总和——即62 在这种情况下?

【问题讨论】:

只是为了好玩:用reduce 自己实现sum -- reduce 是更通用的形式(例如summinmax 都可以写成在reduce) 方面,可以轻松解决其他问题(例如product)。 Guido 说的怎么样——我想我没记错——reduce 正在消失?我和你在一起。为什么要从语言中删除它? 【参考方案1】:

如你所料:

sum(d.values())

【讨论】:

好吧,Python 2.7.12 也适用于 sum(d.values()) @LancelotHolmes 是的,但这会在内存中建立一个列表,因此可能会更慢/更接近大型词典的资源限制。因此,在讨论 Python 2 时,这个答案说“你可能想要使用”而不是“你必须使用”。 不错!我寻找它只是因为我知道会有类似的东西。并不是说编写一个愚蠢的 for 循环需要太多的工作;) 不知道你是喜欢python,还是喜欢python 3,还是真的指的是python 2 @LucasVazquez 这指的是 Python 2(或 1)。我删除了它,因为它现在已经无关紧要了——即使你用 Python2 编写新代码,你也可以使用d.values()【参考方案2】:

在 Python 2 中,您可以通过使用 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 模块所做的。

【讨论】:

是的,虽然这不适用于 python 3。【参考方案3】:

当然有。这是一种对字典的值求和的方法。

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

【讨论】:

【参考方案4】:
d = 'key1': 1,'key2': 14,'key3': 47
sum1 = sum(d[item] for item in d)
print(sum1)

你可以使用 for 循环来做到这一点

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

sum(d.values())

"d" -> 你的字典变量

【讨论】:

【参考方案8】:

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

对于 python 3:

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

更新! 有人抱怨它不起作用!我只是附上我终端的截图。可能是版本不匹配等。

【讨论】:

即使我们尝试这种方式也存在同样的问题 它对我来说很好用!我用截图更新了我的答案(不能在这里做);它可能与版本有关...【参考方案9】:

您可以为此考虑“for循环”:

  d = 'data': 100, 'data2': 200, 'data3': 500
  total = 0
  for i in d.values():
        total += i

总计 = 800

【讨论】:

或者只是sum(d.values()),因为.values()返回一个List 是的,这也是另一种方式。【参考方案10】:

最简单/最愚蠢的解决方案:

https://trinket.io/python/a8a1f25353

d = 'key1': 1,'key2': 14,'key3': 47
s = 0
for k in d:
    s += d[k]

print(s)

或者如果你想要更漂亮:

https://trinket.io/python/5fcd379536

import functools

d = 'key1': 1,'key2': 14,'key3': 47
s = functools.reduce(lambda acc,k: acc+d[k], d, 0)

print(s)

【讨论】:

【参考方案11】:

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

例子:

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

sum(list(c.values()))

【讨论】:

如果它不起作用,这是一个怎样的答案。看起来更像是对其他答案的评论。

以上是关于如何对字典中的所有值求和?的主要内容,如果未能解决你的问题,请参考以下文章

如何在将连字符作为值之一的同时对字符串数据类型中的键的列表中的值求和

如何在 SwiftUI 中对列表中的值求和?

在嵌套字典中求和值

如何通过对第 3 列中的值求和,将前 2 列中具有相同值的 Pandas Dataframe 行组合在一起?

SQLite如何对`GridView`中列的值求和

包含重复项的嵌套字典中的求和值