如何基于Python中字典中的值合并列表中的字典?

时间:2014-04-04 10:14:41

标签: python list dictionary

我有一个字典列表,如下所示:

result = [
    {'so': 'SO1', 'amt':250},
    {'so': 'SO2', 'amt':200},
    {'so': 'SO1', 'amt':100}
]

我需要合并它,结果是:

result = [
    {'so': 'SO1', 'amt':350},
    {'so': 'SO2', 'amt':200}
]

即合并具有相同SO的词典并添加amt

3 个答案:

答案 0 :(得分:3)

Collections.counter提供了一种以这种方式合并字典的优雅方式。

from collections import Counter
counters = [Counter({k['so']: k['amt']}) for k in result]
r = sum(counters, Counter())
# Counter({'SO1': 350, 'SO2': 200})
result = [{'so': k, 'amt': r.get(k)} for k in r]
# [{'so': 'SO1', 'amt': 350}, {'so': 'SO2', 'amt': 200}]

答案 1 :(得分:2)

我的解决方案:

d = dict()
for so, amt in map(lambda x: (x["so"],x["amt"]), result):
    d[so] = d.get(so, 0) + amt

d是您想要的最终字典。如果您有一个巨大的列表result,则应该使用imap而不是地图。

<强>解释

map(lambda x: (x["so"],x["amt"]), result)会产生以下列表:

result = [
    ('SO1', 250),
    ('SO2', 200),
    ('SO1', 100)
]

d.get(so,0)d[so]类似,但如果d没有值为so的键,则返回0作为默认值。

答案 2 :(得分:1)

试试这个..

import collections

data = collections.OrderedDict()
for d in dictlist:
    so = d['so']
    data.setdefault(so, 0)
    data[so] += d['amt']
result = [{'so':k, 'amt': v} for k, v in data.items()]

希望这有帮助