簡體   English   中英

如何通過合並其他列表中的字典來在python中創建新的字典列表?

[英]How to create new list of dicts in python by consolidating dicts in another list?

在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循環,但始終收到“ dict無法散列”的錯誤。 此數據結構的最佳解決方案是什么?

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)

這是我使用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的一個很好的例子嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM