基于多公共键合并字典列表并按指定标题整合
多公共键字典列表合并实现
问题说明
现有两个字典列表:
dictlist1 = [ {"air": "xenon", "severity": "high", "ball": "cricket"}, {"air": "nitrogen", "severity": "low", "ball": "tennis"}, ] dictlist2 = [ {"air": "xenon", "severity": "high", "country": "india"}, {"air": "nitrogen", "severity": "low", "country": "australia"}, ]
需要基于air和severity两个公共键将它们合并,生成如下格式的结果:
[ { "air": "xenon", "severity": "high", "dict_name1": {"ball": "cricket"}, "dict_name2": {"country": "india"}, }, { "air": "nitrogen", "severity": "low", "dict_name1": {"ball": "tennis"}, "dict_name2": {"country": "australia"}, }, ]
目前已有支持单公共键合并的Python代码,需要修改为支持多公共键的版本。
修改后的实现代码
def find_by_keys(lst, keys, target_dict): """根据多个键的组合在列表中查找匹配字典的索引""" target_key_values = tuple(target_dict[key] for key in keys) for i, dic in enumerate(lst): current_key_values = tuple(dic[key] for key in keys) if current_key_values == target_key_values: return i return -1 def merge_dicts(*dict_lists, common_keys): result = [] for dict_name, dict_list in dict_lists: for d in dict_list: # 查找当前字典在结果列表中的位置 i = find_by_keys(result, common_keys, d) if i > -1: # 复制当前字典,移除公共键后存入结果 filtered_dict = {k: v for k, v in d.items() if k not in common_keys} result[i][dict_name] = filtered_dict else: # 新建结果项,先保存公共键 temp = {key: d[key] for key in common_keys} # 复制当前字典,移除公共键后存入对应名称的字段 filtered_dict = {k: v for k, v in d.items() if k not in common_keys} temp[dict_name] = filtered_dict result.append(temp) return result
代码调用示例
# 调用合并函数 merged_result = merge_dicts( ("dict_name1", dictlist1), ("dict_name2", dictlist2), common_keys=["air", "severity"] ) # 格式化打印结果 import json print(json.dumps(merged_result, indent=4))
运行后会输出符合需求的合并结果。
关键修改点说明
- 多键查找适配:将原单键查找函数改为
find_by_keys,通过生成多个公共键的键值对元组判断字典是否匹配,确保多键组合一致才视为同一记录。 - 参数扩展:将原函数的
common_key参数改为common_keys,支持传入列表或元组形式的多个公共键。 - 过滤逻辑优化:用字典推导式直接移除公共键,替代原代码中先复制再
pop的方式,逻辑更简洁高效。 - 合并逻辑简化:去掉原代码中多余的重复查找步骤,直接基于当前处理的字典生成过滤后的子字典,避免索引错误。
内容的提问来源于stack exchange,提问作者Athithiya Raj
相关产品推荐
相关产品推荐

