2016-08-29 3 views
0

Как объединить строки словарей с одинаковыми ключами. Например, если у меня естьОбъединить словари на основе значения ключа

my_dict_list = [{'prakash': ['confident']}, 
{'gagan': ['good', 'luck']}, 
{'jitu': ['gold']}, 
{'jitu': ['wins']}, 
{'atanu': ['good', 'glory']}, 
{'atanu': ['top', 'winner','good']}] 

Моя цель состоит в том, чтобы получить

my_new_dict_list = [{'prakash': ['confident']}, 
{'gagan': ['good', 'luck']}, 
{'jitu': ['gold','wins']}, 
{'atanu': ['good', 'glory','top', 'winner','good']}] 

Как сделать это в Python?

EDIT: словари в конечном списке должны содержать повторяющиеся значения, если они присутствуют в стартовом списке.

+1

Возможный дубликат (http://stackoverflow.com/questions/38987/how-can-i-merge-two-python -dictionaries-in-a-single-expression) – Ian

+0

@Prashanth: Зачем вам нужен список dicts с одним элементом в каждом dict. Разве это не единичный дикт? –

+0

@MoinuddinQuadri Да, единственный список тоже хорош. Я немного изменил вопрос. Я должен включать термины, даже если он уже появился в списке. Смотрите, что ключ «atanu» имеет два значения «хорошо». – prashanth

ответ

0

минималистский подход с использованием defaultdict:

from collections import defaultdict 

my_dict_list = [{'prakash': ['confident']}, 
{'gagan': ['good', 'luck']}, 
{'jitu': ['gold']}, 
{'jitu': ['wins']}, 
{'atanu': ['good', 'glory']}, 
{'atanu': ['top', 'winner','good']}] 

merged_dict = defaultdict(list) 
for d in my_dict_list: 
    for key, value in d.items(): 
     merged_dict[key].extend(value) 
result = [{key:value} for key, value in merged_dict.items()] 

print(result) 

Выход

[{'prakash': ['confident']}, 
{'gagan': ['good', 'luck']}, 
{'atanu': ['good', 'glory', 'top', 'winner', 'good']}, 
{'jitu': ['gold', 'wins']}] 
+0

Спасибо. Это помогло! Я сделал небольшое изменение в вопросе. Но код все еще работает очень хорошо. – prashanth

+0

Мое удовольствие :) Также этот подход работает с вашим уточненным требованием, как показано выше. –

2

Вы могли бы цикл по dicts в списке и либо вставить или добавить пары ключ-значение нового Dict:

my_dict_list = [{'prakash': ['confident']}, 
       {'gagan': ['good', 'luck']}, 
       {'jitu': ['gold']}, 
       {'jitu': ['wins']}, 
       {'atanu': ['good', 'glory']}, 
       {'atanu': ['top', 'winner']}] 


new_d = {} 
for d in my_dict_list: 
    for k, v in d.items(): 
     if k in new_d: 
      new_d[k] += v 
     else: 
      new_d[k] = v 

Тогда вам нужно сделать список из результата:

l = [{k: v} for k, v in new_d.items()] 
# [{'atanu': ['good', 'glory', 'top', 'winner']}, {'gagan': ['good', 'luck']}, {'prakash': ['confident']}, {'jitu': ['gold', 'wins']}] 

Вы должны знать, что порядок элементов в списке может быть изменен этим.

1

Вот рабочий пример:

from itertools import groupby 

my_dict_list = [ 
    {'prakash': ['confident']}, 
    {'gagan': ['good', 'luck']}, 
    {'jitu': ['gold']}, 
    {'jitu': ['wins']}, 
    {'atanu': ['good', 'glory']}, 
    {'atanu': ['top', 'winner']} 
] 

my_new_dict_list = [] 
for k, g in groupby(my_dict_list, key=lambda x: sorted(x.keys())): 
    ds = list(g) 
    d = {} 
    for k in ds[0].iterkeys(): 
     d[k] = sum([d[k] for d in ds], []) 
    my_new_dict_list .append(d) 

print my_new_dict_list 
1
my_dict_list = [{'prakash': ['confident']}, 
{'gagan': ['good', 'luck']}, 
{'jitu': ['gold']}, 
{'jitu': ['wins']}, 
{'atanu': ['good', 'glory']}, 
{'atanu': ['top', 'winner','good']}] 

my_new_dict_list = [] 
tmp_dict = {} 
order = [] 

for d in my_dict_list: 
    for k, v in d.iteritems(): 
     if not k in order: order.append(k) 
     tmp_dict.setdefault(k, []).extend(v) 

my_new_dict_list = [ {x: tmp_dict[x] } for x in order ] 

Вывод: [? Как я могу объединить два словаря Python в одном выражении]

[{'prakash': ['confident']}, 
{'gagan': ['good', 'luck']}, 
{'jitu': ['gold', 'wins']}, 
{'atanu': ['good', 'glory', 'top', 'winner', 'good']}] 
Смежные вопросы