在基于值的列表中组合词典

时间:2014-07-31 10:59:26

标签: python dictionary

我无法理解这个问题:

我有一个清单:

[{'name' : 'Bob', 'Salary2014' : 2000}, {'name': 'Alice', 'Salary2014' : 1000}, {'name':'Bob', 'Salary2013' : 1500}]

我想在名字的基础上加入词典(这是唯一的)

[{'name' : 'Bob', 'Salary2014' : 2000, 'Salary2013' : 1500}, {'name': 'Alice', 'Salary2014' : 1000}]

我知道解决方案必须简单,并且可能涉及.update方法,但我只是不明白。

2 个答案:

答案 0 :(得分:1)

使用新词典根据名称跟踪词典:

combined = {}
for d in yourlist:
    combined.setdefault(d['name'], {}).update(d)

output = combined.values()

如果combined.setdefault()不存在,{}方法会将d['name']设置为默认值,然后使用当前迭代更新字典。

如果您使用的是Python 3,请使用list(combined.values())

演示:

>>> yourlist = [{'name' : 'Bob', 'Salary2014' : 2000}, {'name': 'Alice', 'Salary2014' : 1000}, {'name':'Bob', 'Salary2013' : 1500}]
>>> combined = {}
>>> for d in yourlist:
...     combined.setdefault(d['name'], {}).update(d)
... 
>>> combined.values()
[{'Salary2013': 1500, 'name': 'Bob', 'Salary2014': 2000}, {'name': 'Alice', 'Salary2014': 1000}]

答案 1 :(得分:0)

另一种非常类似的方法是使用defaultdict

from collections import defaultdict

inp = [{'name': 'Bob', 'Salary2014': 2000},
       {'name': 'Alice', 'Salary2014': 1000},
       {'name': 'Bob', 'Salary2013': 1500}]

out = defaultdict(dict)

for rec in inp:
    out[rec['name']].update(rec)

print out.values()