Python按相同字段值合并两个字典列表的实现问题
问题原因
你使用zip(a,b)的逻辑是按两个列表的索引位置一一配对元素,而你给出的b列表中name字段的排列顺序和a列表不一致,因此只有位置刚好对应的条目能匹配成功,其余都会匹配失败。
注意:你提供的b列表存在语法错误,
{'name': 'chris', 'exam 2': 'C#'}这一行末尾缺少逗号,运行前需先补全。
解决方案
方法1:字典映射法(推荐,时间复杂度O(n+m),性能最优)
先将其中一个列表转换为以name为键的字典,实现O(1)效率的查找匹配,再遍历另一个列表完成合并:
# 把b列表转换为 name: 对应字典 的映射结构 b_map = {item['name']: item for item in b} c = [] for item_a in a: name = item_a['name'] # 合并a当前条目和b中匹配的条目 merged_item = {**item_a, **b_map.get(name, {})} c.append(merged_item)
如果需要同时保留仅存在于b列表中的name条目,可以在上述代码执行完成后,再遍历b列表把没有出现在a中的条目补入c即可。
方法2:pandas合并(适合复杂多表合并场景)
如果你的项目已经引入pandas依赖,可以直接用merge方法实现多字段合并,代码更简洁:
import pandas as pd df_a = pd.DataFrame(a) df_b = pd.DataFrame(b) # 按name字段合并,how参数可选inner/outer/left/right匹配规则 c = pd.merge(df_a, df_b, on='name', how='outer').to_dict('records')
内容的提问来源于stack exchange,提问作者user3568896
相关产品推荐
相关产品推荐

