2010-09-22 2 views
0

В Python, у меня есть список dicts следующим образом:Как создать новый список dicts в python, объединив dicts в другом списке?

orig_list = [ 
{'first_name': u'Jake', 'last_name': u'Sarson', 'team': u'TeamOne', 
'display_name': u'AVG', 'value': 7.0}, 

{'first_name': u'Mike', 'last_name': u'Walsh', 'team': u'TeamTwo', 
'display_name': u'AVG', 'value': 12.0}, 

{'first_name': u'Jake', 'last_name': u'Sarson', 'team': u'TeamOne', 
'display_name': u'AVG', 'value': 7.0}, 

{'first_name': u'Mike', 'last_name': u'Walsh', 'team': u'TeamTwo', 
'display_name': u'AVG', 'value': 12.0}, 

{'first_name': u'Steve', 'last_name': u'Mottola', 'team': u'TeamTwo', 
'display_name': u'AVG', 'value': 18.0}, 

{'first_name': u'Steve', 'last_name': u'Mottola', 'team': u'TeamTwo', 
'display_name': u'AVG', 'value': 18.0}, 

{'first_name': u'Craig', 'last_name': u'Schubert', 'team': u'TeamOne', 
'display_name': u'AVG', 'value': 23.5}, 

{'first_name': u'Steve', 'last_name': u'Mottola', 'team': u'TeamTwo', 
'display_name': u'REC', 'value': 2.0}, 

{'first_name': u'Mike', 'last_name': u'Walsh', 'team': u'TeamTwo', 
'display_name': u'REC', 'value': 1.0}, 

{'first_name': u'Jake', 'last_name': u'Sarson', 'team': u'TeamOne', 
'display_name': u'REC', 'value': 1.0}, 

{'first_name': u'Craig', 'last_name': u'Schubert', 'team': u'TeamOne', 
'display_name': u'REC', 'value': 2.0}, 

{'first_name': u'Craig', 'last_name': u'Schubert', 'team': u'TeamOne', 
'display_name': u'TD', 'value': 1.0}, 

{'first_name': u'Steve', 'last_name': u'Mottola', 'team': u'TeamTwo', 
'display_name': u'YDS', 'value': 36.0}, 

{'first_name': u'Jake', 'last_name': u'Sarson', 'team': u'TeamOne', 
'display_name': u'YDS', 'value': 7.0}, 

{'first_name': u'Mike', 'last_name': u'Walsh', 'team': u'TeamTwo', 
'display_name': u'YDS', 'value': 12.0}, 

{'first_name': u'Craig', 'last_name': u'Schubert', 'team': u'TeamOne', 
'display_name': u'YDS', 'value': 47.0}] 

Мне нужно создать новый список dicts из первого списка, чтобы найти уникальные имена и для каждого имени найти все display_name-х и значение , В сущности, результат должен быть:

[{'first_name': u'Jake', 'last_name': u'Sarson', 'team': u'TeamOne', 
    'AVG': 7.0, 'REC': 1.0, 'YDS': 7.0}, 
{'first_name': u'Mike', 'last_name': u'Walsh', 'team': u'TeamTwo', 
    'AVG': 12.0, 'REC': 1.0, 'YDS': 12.0}, 
{'first_name': u'Steve', 'last_name': u'Mottola', 'team': u'TeamTwo', 
    'AVG': 18.0, 'REC': 2.0, 'YDS': 36.0}, 
{'first_name': u'Craig', 'last_name': u'Schubert', 'team': u'TeamOne', 
    'AVG': 23.5, 'REC': 2.0, 'TD': 1.0, 'YDS': 47.0}] 

Я попытался с вложенными для петель, но продолжал получать ошибку, что «ДИКТ является unhashable.» Какое наилучшее решение для этой структуры данных?

+1

Вы уже читали о методе словаря 'update'? Если нет, прочитайте это и пересмотрите свой вопрос. –

+0

Спасибо. Я буду читать по методу обновления. Документы python иногда не помогают мне все время, и только если я вижу пример, я понимаю. – simi

+0

«только если я вижу пример, который я понимаю». Возможно, вы должны найти способ преодолеть это. Документация Python - отличный ресурс, и вы могли бы быстрее решать проблемы, если бы могли найти способ их прочитать. –

ответ

2
temp = {} 
for rec in orig_list: 
    temp.setdefault((rec['first_name'], rec['last_name'], rec['team']), {}).setdefault(rec['display_name'], rec['value']) 

persons = [] 
for key, person in temp.iteritems(): 
    person.update(dict(zip(('first_name', 'last_name', 'team'), key))) 
    persons.append(person) 
+0

Спасибо, eumiro. Это дает мне результат, который я хочу. Я буду читать обновления и setdefault, чтобы понять, как все это работает. – simi

+1

Что случилось с 'collections.defaultdict'? –

0

Вот что я получил с помощью collections.defaultdict:

 
from collections import defaultdict 
j = defaultdict(dict) 
for player in origlist: 
j[(player['first_name'],player['last_name'],player['team'])].update({player['display_name']: player['value']}) 

Это дает мне следующий результат для j.items():

 
[((u'Mike', u'Walsh', u'TeamTwo'), {u'AVG': 12.0, u'REC': 1.0, u'YDS': 12.0}), 
((u'Jake', u'Sarson', u'TeamOne'), {u'AVG': 7.0, u'REC': 1.0, u'YDS': 7.0}), 
((u'Steve', u'Mottola', u'TeamTwo'), 
    {u'AVG': 18.0, u'REC': 2.0, u'YDS': 36.0}), 
((u'Craig', u'Schubert', u'TeamOne'), 
    {u'AVG': 23.5, u'REC': 2.0, u'TD': 1.0, u'YDS': 47.0})] 

от j.items (), то я собираюсь составить окончательный список:

 
nl0 = [] 
for k,v in j.items(): 
    o = {'first_name': k[0], 'last_name': k[1], 'team': k[2]} 
    o.update(v) 
    nl0.append(o) 
    o = {} 

И результат, что мне нужно:

 
[{u'AVG': 12.0, 
    u'REC': 1.0, 
    u'YDS': 12.0, 
    'first_name': u'Mike', 
    'last_name': u'Walsh', 
    'team': u'TeamTwo'}, 
{u'AVG': 7.0, 
    u'REC': 1.0, 
    u'YDS': 7.0, 
    'first_name': u'Jake', 
    'last_name': u'Sarson', 
    'team': u'TeamOne'}, 
{u'AVG': 18.0, 
    u'REC': 2.0, 
    u'YDS': 36.0, 
    'first_name': u'Steve', 
    'last_name': u'Mottola', 
    'team': u'TeamTwo'}, 
{u'AVG': 23.5, 
    u'REC': 2.0, 
    u'TD': 1.0, 
    u'YDS': 47.0, 
    'first_name': u'Craig', 
    'last_name': u'Schubert', 
    'team': u'TeamOne'}] 

Это хороший пример того, как использовать collections.defaultdict?

Смежные вопросы