根据键合并两个字典列表


dict1 = [{'id': 1.0, 'name': 'aa'},
{'id': 4.0, 'name': 'bb'},
{'id': 2.0, 'name': 'cc'}]

dict2 = [{'name': 'aa', 'dtype': 'StringType'},
{'name': 'bb', 'dtype': 'StringType'},
{'name': 'xx', 'dtype': 'StringType'},
{'name': 'cc', 'dtype': 'StringType'}]

我想根据它们共同的key(即name)合并这两个字典。

我希望得到以下期望的结果。

merged_dict= [{'id': 1.0, 'name': 'aa', 'dtype': 'StringType'},
{'id': 4.0, 'name': 'bb', 'dtype': 'StringType'},
{'id': 2.0, 'name': 'cc', 'dtype': 'StringType'}]

我试图使用下面的for循环得到这个

for i in dict1:
for j in dict2:
j.update(i)

为了避免二次复杂度,最好先创建一个真正的字典(你的是字典列表),然后update:

tmp = {d['name']: d for d in dict2}
for d in dict1:
d.update(tmp.get(d['name'], {}))
print(dict1)

输出:

[{'id': 1.0, 'name': 'aa', 'dtype': 'StringType'},
{'id': 4.0, 'name': 'bb', 'dtype': 'StringType'},
{'id': 2.0, 'name': 'cc', 'dtype': 'StringType'}]

中间tmp:

{'aa': {'name': 'aa', 'dtype': 'StringType'},
'bb': {'name': 'bb', 'dtype': 'StringType'},
'xx': {'name': 'xx', 'dtype': 'StringType'},
'cc': {'name': 'cc', 'dtype': 'StringType'}}

如果您想要复制(而不是修改dict1):

tmp = {d['name']: d for d in dict2}
merged_dict = [d|tmp.get(d['name'], {}) for d in dict1]

您可以使用pandas并尝试以下操作:

import pandas as pd
df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
res = df1.merge(df2, on=['name'])

输出:

id name       dtype
0  1.0   aa  StringType
1  4.0   bb  StringType
2  2.0   cc  StringType

如果需要字典,可以将合并结果pd.DataFrame()转换为dict

res.to_dict('records')

最终输出为:

[
{'id': 1.0, 'name': 'aa', 'dtype': 'StringType'}, 
{'id': 4.0, 'name': 'bb', 'dtype': 'StringType'}, 
{'id': 2.0, 'name': 'cc', 'dtype': 'StringType'}
]

相关内容

  • 没有找到相关文章

最新更新