如何将分配给字典列表中的键的值相加?

时间:2018-01-07 22:19:07

标签: python list dictionary

我有以下词典列表:

A=[
    {key1 : val11, key2 : val21, key3 : val31, key5 : val51, key6 : val61},
    {key2 : val22, key3 : val32, key5 : val52, key6 : val62},
    {key1 : val13, key2 : val23, key4 : val43, key5 : val53},
    {key1 : val14, key3 : val34, key4 : val44, key5 : val54, key6 : val64},
    {key4 : val45, key5 : val55, key6 : val65}
]

如您所见,字典的长度不同,每个字典中的key : value也不一定相似。我想知道如何在所有词典中为每个键分配的值总和:

例如key4: (val43 + val44 + val45)key3: (val31 + val32 + val34)

2 个答案:

答案 0 :(得分:3)

从此开始 -

A = [{1 : 5, 2  : 3, 3 : 4}, {1 : 1, 5: 10, 3: 2}, {100 : 2}]

以下是使用collections.Counter数据结构

获取所需内容的一种方法
  1. 使用Counter
  2. 将每个字典转换为map
  3. 使用Counter
  4. 对每个sum对象求和

    from collections import Counter
    r = sum(map(Counter, A), Counter())
    

    r
    Counter({1: 6, 2: 3, 3: 6, 5: 10, 100: 2})
    

    关于Counter的好处是你可以很好地添加它们。 sum的第二个参数是“和”的开头。如果您想要返回字典(而不是Counter),请拨打dict(r)

    请注意,当您的dicts只包含带有数值的键时,此解决方案才有效。

答案 1 :(得分:2)

您也可以使用collections.defaultdict来获取与每个键对应的所有值的计数。您需要做的就是迭代每个元素并将值汇总到defaultdict。例如:

my_list = [
     {'key1': 2, 'key2': 7},
     {'key2': 6, 'key3': 8},
     {'key1': 7, 'key4':9} 
 ]

from collections import defaultdict
my_counter = defaultdict(int)

for my_dict in my_list:                 # iterate your `list`
    for key, value in my_dict.items():  # iterate "key", "value" pairs of your `dict`
        my_counter[key] += value        # sum the "value" and add to the dict

这会将dict作为:

返回给您
>>> my_counter
defaultdict(<type 'int'>, {'key3': 8, 'key2': 13, 'key1': 9, 'key4': 9})