Python:将列表中的多个词典与值的更新合并

时间:2013-10-12 03:31:12

标签: python dictionary

这是我的词典列表:

dict_list=[{'red':3, 'orange':4}, {'blue':1, 'red':2},
   {'brown':4, 'orange':7}, {'blue':4, 'pink':10}]

这是我的desired outcome

[{'red':5, 'orange':11, 'blue':5, 'brown':4, 'pink':10}]

我尝试使用sum但收到错误消息,此处更新似乎不合适。

 update_dict={}
 for x in dict_list:
     for a in x.items():
         update_dict+= x[a]

有什么建议吗?感谢。

2 个答案:

答案 0 :(得分:3)

defaultdict是你的朋友。

from collections import defaultdict

d = defaultdict(int)

for subdict in dict_list:
    for k,v in subdict.items():
        d[k] += int(v)

Python 3语法。 int(v)是必需的,因为您的词典中包含混合字符串和整数值。

要获得所需的输出:

d
Out[16]: defaultdict(<class 'int'>, {'orange': 11, 'blue': 5, 'pink': 10, 'red': 5, 'brown': 4})

[dict(d)]
Out[17]: [{'blue': 5, 'brown': 4, 'orange': 11, 'pink': 10, 'red': 5}]

答案 1 :(得分:0)

让我们通过将dict_list转换为元组列表来简化这一点。 itertools.chain擅长此类事情。

from itertools import chain

dict_list=[{'red':'3', 'orange':4}, {'blue':'1', 'red':2},
  {'brown':'4', 'orange':7}, {'blue':'4', 'pink':10}]

def dict_sum_maintain_types(dl):
  pairs = list(chain.from_iterable(i.items() for i in dl))

  # Initialize the result dict. 
  result = dict.fromkeys(chain(*dl), 0)

  # Sum the values as integers.
  for k, v in pairs:
    result[k] += int(v)

  # Use the type of the original values as a function to cast the new values
  # back to their original type.
  return [dict((k, type(dict(pairs)[k])(v)) for k, v in result.items())] 

>>> dict_sum_maintain_types(dict_list)
[{'orange': 11, 'blue': '5', 'pink': 10, 'red': 5, 'brown': '4'}]