2010-09-22 4 views
0

En Python, j'ai une liste de dicts comme suit:Comment créer une nouvelle liste de dicts en python en consolidant des dicts dans une autre liste?

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}] 

Je dois créer une nouvelle liste de dicts de la première liste pour trouver les noms uniques et pour chaque nom trouvent tous de la display_name et les valeurs . En substance, le résultat devrait être:

[{'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}] 

J'ai essayé avec des boucles imbriquées mais je continuais à une erreur que le « dict est unhashable. » Quelle est la meilleure solution pour cette structure de données?

+1

Avez-vous déjà lu la méthode 'update' du dictionnaire? Si ce n'est pas le cas, veuillez le lire et réviser votre question. –

+0

Merci. Je vais lire sur la méthode de mise à jour. Les docs python parfois ne m'aident pas tout le temps et seulement si je vois un exemple que je comprends. – simi

+0

"seulement si je vois un exemple que je comprends" Peut-être que vous devriez trouver un moyen de surmonter cela. La documentation Python est une excellente ressource, et vous pourriez résoudre les problèmes plus rapidement si vous pouviez trouver un moyen de les lire. –

Répondre

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

Merci eumiro. Cela me donne la sortie que je veux. Je vais lire sur update et setdefault pour comprendre comment tout cela fonctionne. – simi

+1

Quel est le problème avec 'collections.defaultdict'? –

0

Voici ce que je suis arrivé à l'aide 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']}) 

Cela me donne la sortie suivante pour 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})] 

Des j.items () alors je vais construire la liste finale:

 
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 = {} 

Le résultat est ce que je dois:

 
[{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'}] 

Est-ce un bon exemple de la façon d'utiliser collections.defaultdict?

Questions connexes