在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}]
我尝试使用嵌套for循环,但仍然收到“dict不可用”的错误。这种数据结构的最佳解决方案是什么?
答案 0 :(得分: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)
答案 1 :(得分: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的一个很好的例子吗?