基于非唯一键合并两个非相同字典列表的技术问询
合并两个字典列表(基于非唯一键匹配)
你需要将两个字典列表d1和d2按照d1['Name']与d2['column_name']的匹配关系进行合并,保留所有条目——匹配上的合并键值对,未匹配的保留原内容。你之前尝试的Counter方法并不适用这个场景,因为Counter的核心作用是统计计数,和字典合并的需求不匹配,而且你的代码里还引用了不存在的val_count键,这也会导致报错。
原始数据
首先明确你的输入数据:
d1 = [{'del': True, 'Name': 'tbl_n','node':'3'}, {'del': True, 'Name': 'src_n','node':'5'}] d2 = [{'items':'23', 'column_name':'tbl_n','created':'3.34','count':0,'valid':'yes'}, {'items':'43', 'column_name':'src_n','created':'3.34','count':40,'valid':'yes'}, {'items':'22', 'column_name':'mod_n','created':'3.34','count':13,'valid':'no'}]
正确实现方法
我们可以先把d2转换成以column_name为键的映射字典,这样能快速查找匹配项,然后分别处理匹配条目和未匹配条目:
# 将d2转换为以column_name为键的字典,提升匹配效率 d2_mapping = {item['column_name']: item for item in d2} merged_list = [] # 处理d1中能匹配到d2的条目 for d1_item in d1: current_name = d1_item['Name'] if current_name in d2_mapping: # 合并两个字典,这里用**解包的方式合并,也可以用Python3.9+的 | 运算符 combined = {**d1_item, **d2_mapping[current_name]} # 移除重复的column_name键,统一使用Name combined.pop('column_name', None) merged_list.append(combined) # 从映射中删除已处理的条目,避免后续重复添加 del d2_mapping[current_name] # 处理d2中未匹配到d1的剩余条目 for remaining_item in d2_mapping.values(): merged_list.append(remaining_item) # 输出结果 print(merged_list)
输出结果
运行上述代码后,得到的结果与你期望的d3一致(修正了你期望输出中的语法小错误):
[ {'del': True, 'Name': 'tbl_n', 'node': '3', 'items': '23', 'created': '3.34', 'count': 0, 'valid': 'yes'}, {'del': True, 'Name': 'src_n', 'node': '5', 'items': '43', 'created': '3.34', 'count': 40, 'valid': 'yes'}, {'items': '22', 'column_name': 'mod_n', 'created': '3.34', 'count': 13, 'valid': 'no'} ]
逻辑说明
- 构建映射字典:把
d2转成column_name到对应条目的映射,这样查找匹配项的时间复杂度从O(n)降到O(1),处理大量数据时效率更高。 - 合并匹配条目:遍历
d1的每个条目,找到对应的d2条目后合并,同时移除重复的column_name键,保证结果格式统一。 - 添加未匹配条目:把
d2中没有匹配到d1的条目直接添加到结果列表,确保没有遗漏。
内容的提问来源于stack exchange,提问作者Muthu
相关产品推荐
相关产品推荐

