2014-04-04 1 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}] 
Смежные вопросы