2014-04-04 155 views
1

我的词典列表如下图所示:如何基于Python中的字典中的值合并列表中的字典?

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

我需要合并它,这样的结果将是:

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

即与同一SO字典经合并,它们amt被添加。

+0

@ sshashank124我认为这个特殊的例子比在提出的问题中提出的复制稍微复杂一点。 – skamsie

+0

@HerrActress,OP应该能够从这个问题中得到足够的想法,然后能够根据自己的需要来安排它。问题不在于找到__exactly__类似的问题,而是类似的问题。还有一点就是通过实践学习,得到了相当相关的答案。但是,如果您仍然相信,请告诉我,我将收回我的近距离投票。 :) – sshashank124

+0

@ sshashank124你可能是对的,加上另外4个人似乎认为相同:) – skamsie

回答

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],但作为默认值返回0时d与价值so没有钥匙。

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()] 

希望这有助于

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}] 
相关问题