con*_*fun 3 python dictionary python-2.7 python-3.x
我有两个列表,如下所示。我想使用旧列表更新新列表。更新新列表的条件是name旧列表中的匹配值。最好的方法是什么?
输入
old_list = [{'age': 35, 'name': 'james'}, {'age': 42, 'name': 'bob'}]
new_list = [{'name': 'peter'}, {'name': 'james'}, {'age': 50, 'name': 'bob'}]
Run Code Online (Sandbox Code Playgroud)
预期输出
[{'name': 'peter'}, {'age': 35, 'name': 'james'}, {'age': 42, 'name': 'bob'}]
Run Code Online (Sandbox Code Playgroud)
编辑:添加我的解决方案
我知道的一种解决方案可以使用多个循环和 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
Run Code Online (Sandbox Code Playgroud)
您需要一种结构,允许您从一个列表中查找另一个列表中的项目。字典提供了这样的结构:
lookup = {x['name']: x for x in new_list}
lookup.update({x['name']: x for x in old_list})
Run Code Online (Sandbox Code Playgroud)
如果您确实想要的话,您可以转换回列表:
result = list(lookup.values())
Run Code Online (Sandbox Code Playgroud)
在 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)
Run Code Online (Sandbox Code Playgroud)
如果没有排序,结果dict.values()将是任意顺序,并且可能在解释器的运行之间发生变化。
附录
任何时候你看到字典理解,它在功能上都等同于循环for。这是第一个建议代码的“扩展”版本:
lookup = {}
for d in new_list:
lookup[d['name']] = d
for d in old_list:
lookup[d['name']] = d
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1844 次 |
| 最近记录: |