【问题标题】:How to sum all the values in a dictionary?如何对字典中的所有值求和?
【发布时间】:2023-03-24 13:32:01
【问题描述】:

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

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

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

【问题讨论】:

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

标签: python dictionary hash sum


【解决方案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()))
              

              【讨论】:

              • 如果它不起作用,这是一个怎样的答案。看起来更像是对其他答案的评论。
              猜你喜欢
              • 2016-12-21
              • 1970-01-01
              • 2014-02-26
              • 2020-08-18
              • 1970-01-01
              • 1970-01-01
              • 2022-11-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多