【问题标题】:Python: summing up list of dictionaries with different keys and same valuesPython:总结具有不同键和相同值的字典列表
【发布时间】:2019-08-18 10:52:32
【问题描述】:

我有以下具有不同键和值的字典列表。每个字典只有一个键值对。

[{'a':1}, {'b':1}, {'a':1}, {'b':2}]

我需要以下输出,最好使用列表/字典理解

[{'a': 2, 'b': 3}]

我查看了similar question,但没能找到答案。 请问有什么建议吗?

【问题讨论】:

  • 你正在寻找一个列表/字典理解?
  • 是的,最好
  • 每个dict 是否只包含一个键值对?
  • 是的,一个键值对
  • How to sum dict elements的可能重复

标签: python dictionary sum


【解决方案1】:

在您链接到的问题中有一个答案可以按原样工作:

dict1 = [{'a':1}, {'b':1}, {'a':1}, {'b':2}]

final = {}
for d in dict1:
    for k in d.keys():
        final[k] = final.get(k,0) + d[k]

print (final)

产量:

{'a': 2, 'b': 3}

【讨论】:

    【解决方案2】:

    你可以使用collections.Counter:

    from collections import Counter
    
    lst = [{'a':1}, {'b':1}, {'a':1}, {'b':2}]
    
    c = Counter()
    
    for dct in lst: 
        c.update(dct)
    
    print(c)
    # Counter({'b': 3, 'a': 2})
    

    【讨论】:

    【解决方案3】:

    这可以在一行中完成,无需任何导入,使用一些巧妙的归约

    要了解其工作原理,您必须了解 reduce 的工作原理。本质上,它允许您定义一个操作,该操作从列表中获取两个元素并将它们减少为单个元素。然后它递归地将此操作应用于您的列表,直到列表减少为单个元素。这是单行版本:

    dict1 = [{'a':1}, {'b':1}, {'a':1}, {'b':2}]
    
    print(reduce(lambda a, b: {k: a.setdefault(k, 0) + b.setdefault(k, 0) for k in set(a.keys()).union(b.keys())}, dict1))
    

    在这种情况下,操作定义为:

    lambda a, b: 
            {k: a.setdefault(k, 0) + b.setdefault(k, 0) for k in (set(a.keys()).union(b.keys()))}
    

    也可以表示为:

    # a and b are two elements from the list. In this case they are dictionaries
    def combine_dicts(a, b):
        output = {}
        for k in set(a.keys()).union(b.keys()): # the union of the keys in a and b
            output[k] = a.setdefault(k, 0) + b.setdefault(k, 0)
            # dict.setdefault returns the provided value if the key doesn't exist
        return output
    

    当这个操作通过reduce应用到你的列表时,你会得到想要的输出:

    >>> {'b': 3, 'a': 2}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-18
      • 2019-12-26
      • 2014-04-27
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多