我有两个列表,如下所示。我想使用旧列表更新新列表。更新新列表的条件是旧列表中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
答案 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