python - 如果值相同,则合并两个字典列表
问题描述
我有两个字典列表,如下所示:
a = [
{'name': 'john', 'exam 1': 'python'},
{'name': 'chris', 'exam 1': 'java'},
{'name': 'newman', 'exam 1': 'C'},
{'name': 'sebast', 'exam 1': 'C#'},
{'name': 'penier', 'exam 1': 'python'},
{'name': 'alex', 'exam 1': 'go'},
{'name': 'steve', 'exam 1': 'C#'}
]
b = [
{'name': 'john', 'exam 2': 'django'},
{'name': 'newman', 'exam 2': 'java'},
{'name': 'sebast', 'exam 2': 'C'},
{'name': 'chris', 'exam 2': 'C#'}
{'name': 'penier', 'exam 2': 'python'},
{'name': 'steve', 'exam 2': 'go'},
{'name': 'alex', 'exam 2': 'C#'}
]
我想将它们合并到一本字典中,如下所示:
c = [
{'name': 'john', 'exam 1': 'python', 'exam 2': 'django'},
{'name': 'chris', 'exam 1': 'java', 'exam 2': 'C#'},
{'name': 'newman', 'exam 1': 'C', 'exam 2': 'java'},
{'name': 'sebast', 'exam 1': 'C#', 'exam 2': 'C'},
{'name': 'penier', 'exam 1': 'python', 'exam 2': 'python'},
{'name': 'alex', 'exam 1': 'go', 'exam 2': 'C#'},
{'name': 'steve', 'exam 1': 'C#', 'exam 2': 'go'}
]
我尝试了以下方法:
for i, j in zip(a, b):
if i['name'] == j['name']:
c.update(i)
我得到的结果只是一本字典,它添加了那些相同的行,如果它们的位置不同的话。
解决方案
您可以为每个列表创建两个查找字典,然后找到交集:
import pprint
lookup_A = {d["name"]: d for d in A}
lookup_B = {d["name"]: d for d in B}
result = [{**value, **lookup_B.get(key, {})} for key, value in lookup_A.items()]
pprint.pprint(result)
输出
[{'exam 1': 'python', 'exam 2': 'django', 'name': 'john'},
{'exam 1': 'java', 'exam 2': 'C#', 'name': 'chris'},
{'exam 1': 'C', 'exam 2': 'java', 'name': 'newman'},
{'exam 1': 'C#', 'exam 2': 'C', 'name': 'sebast'},
{'exam 1': 'python', 'exam 2': 'python', 'name': 'penier'},
{'exam 1': 'go', 'exam 2': 'C#', 'name': 'alex'},
{'exam 1': 'C#', 'exam 2': 'go', 'name': 'steve'}]
更新
理解列表推导的更简单方法是执行等效的 for 循环:
result= []
for key, value in lookup_A.items():
result.append({**value, **lookup_B.get(key, {})})
表达方式:
{**value, **lookup_B.get(key, {})}
推荐阅读
- xml - 如何对一系列属性执行 Xpath 循环?
- javascript - Leaflet.js 透明水/海洋
- docker - 使用 Docker 在我的 VPS 上部署我的应用程序的最佳实践是什么?
- javascript - 如何使用 iv & key 和 cryptoswift 进行 AES 解密?
- android - 如何在基于 Xamarin.forms 的 webview 中使用 html5 视频标签?
- redirect - 在 Payara 4.1 或 5 服务器上重定向 POST url
- python - 如何在 Python 中创建具有两个输入(x1,x2)的多层网络
- c - 如何确保在继续之前收到信号
- mariadb - 为什么下面的代码会出现此错误?
- bash - 文本大文本文件的无限循环