如何基于name键合并两个Python字典列表?附尝试代码
基于共同键合并字典列表的正确方法
问题描述
现有两个字典列表:
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'}]
需要基于共同键name合并这两个列表,保留dict1的所有条目,并匹配dict2中对应的dtype,得到预期结果:
merged_dict= [{'id': 1.0, 'name': 'aa', 'dtype': 'StringType'}, {'id': 4.0, 'name': 'bb', 'dtype': 'StringType'}, {'id': 2.0, 'name': 'cc', 'dtype': 'StringType'}]
尝试了以下嵌套循环但未得到预期结果:
for i in dict1: for j in dict2: j.update(i)
错误原因分析
你的代码逻辑存在问题:
- 嵌套循环会把
dict1里的每个字典全部更新到dict2的每一个字典中,不管name是否匹配,导致所有dict2的字典都会被覆盖成最后一个dict1的内容,同时还保留了不需要的xx条目。 - 这种方式不仅效率低(时间复杂度O(n*m)),完全不符合按
name匹配合并的需求。
正确解决方法
方法1:构建索引字典(高效)
先把dict2转换成以name为键的索引结构,实现O(1)时间查找匹配项,再遍历dict1合并:
# 构建dict2的name索引 dict2_index = {item['name']: item for item in dict2} merged_dict = [] for item in dict1: # 合并当前条目与dict2中对应name的内容 merged_item = {**item, **dict2_index.get(item['name'], {})} merged_dict.append(merged_item) print(merged_dict)
方法2:修正嵌套循环
如果坚持用嵌套循环,需先判断name是否匹配,且创建新字典避免修改原数据:
merged_dict = [] for item1 in dict1: for item2 in dict2: if item1['name'] == item2['name']: # 合并两个字典并添加到结果列表 merged_dict.append({**item1, **item2}) # 匹配到就跳出内层循环,避免重复处理 break print(merged_dict)
方法3:列表推导式(简洁版)
结合索引字典用列表推导式实现,代码更简洁:
dict2_index = {item['name']: item['dtype'] for item in dict2} merged_dict = [{'id': d['id'], 'name': d['name'], 'dtype': dict2_index[d['name']]} for d in dict1] print(merged_dict)
以上三种方法都能得到预期结果,其中方法1的效率最高,适合数据量较大的场景。
内容的提问来源于stack exchange,提问作者Hiwot
相关产品推荐
相关产品推荐

