如何使用其他词典列表更新词典列表?

时间:2018-09-13 10:14:23

标签: python python-3.x python-2.7 dictionary

我有两个列表,如下所示。我想使用旧列表更新新列表。更新新列表的条件是旧列表中name的匹配值。最好的方法是什么?

输入

old_list = [{'age': 35, 'name': 'james'}, {'age': 42, 'name': 'bob'}]

new_list = [{'name': 'peter'}, {'name': 'james'}, {'age': 50, 'name': 'bob'}]

预期产量

[{'name': 'peter'}, {'age': 35, 'name': 'james'}, {'age': 42, 'name': 'bob'}]

编辑:添加我的解决方案

我知道一个解决方案,它使用多个循环和if条件来解决此问题。这不是竞争解决方案,因为我需要处理多种情况,例如不存在密钥的情况等。

for x in new_col_list:
    for y in old_col_list:
        if x['name'] == y['name']:
            x['age'] = y['age']
            continue

print new_col_list

1 个答案:

答案 0 :(得分:4)

您需要一种结构,该结构允许您从一个列表中查找另一个列表中的项目。字典提供了这样的结构:

lookup = {x['name']: x for x in new_list}
lookup.update({x['name']: x for x in old_list})

如果您确实想要,可以将其转换回列表:

result = list(lookup.values())

在Python 3.6+中,值的顺序将是新列表的所有元素,然后是所有在旧列表中添加的缺失元素,其顺序与它们在旧列表中的顺序相同。对于较旧的Python版本,可以通过collections.OrderedDict来实现:

lookup = OrderedDict((x['name'], x) for x in new_list)
lookup.update((x['name'], x) for x in old_list)

没有排序,dict.values()的结果将以任意顺序排列,并且在两次解释器运行之间可能会改变。

附录

每当您看到字典理解时,它在功能上都等效于for循环。这是第一个建议代码的“扩展”版本:

lookup = {}
for d in new_list:
    lookup[d['name']] = d
for d in old_list:
    lookup[d['name']] = d