2010-09-22 322 views
0

在Python,我有類型的字典列表如下:如何通過將字典合併到另一個列表中來在python中創建新的字典列表?

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

我需要從第一列表中創建類型的字典新列表中找到了唯一的名稱以及每個名稱找到所有的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}] 

我試着嵌套for循環,但不斷得到一個錯誤,「字典不可用」。這個數據結構的最佳解決方案是什麼?

+1

你讀過關於字典'更新'方法嗎?如果沒有,請閱讀並修改您的問題。 – 2010-09-22 14:05:41

+0

謝謝。我會閱讀更新方法。 python文檔有時並不總是幫助我,只有當我看到一個例子我才明白。 – simi 2010-09-22 14:30:15

+0

「只有當我看到一個例子,我明白嗎」也許你應該找到一種方法來克服這一點。 Python文檔是一個很好的資源,如果你能找到一種方法來閱讀它,你就能更快地解決問題。 – 2010-09-22 14:51:36

回答

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。這確實給了我想要的輸出。我將閱讀update和setdefault以瞭解它是如何工作的。 – simi 2010-09-22 14:31:06

+1

'collections.defaultdict'有什麼問題? – 2010-09-22 14:52:01

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一個很好的例子?