嵌套字典中键含另一键完整子串的关联项合并需求
解决方案
核心思路
我们可以分三步搞定这个需求:
- 先找出所有「基础键」:也就是那些不带
Super/Duper/Uber后缀的键,这些键会作为合并后字典的主键 - 对每个基础键,收集所有同组的关联键(基础键本身 + 带三种后缀的键,只要存在就纳入)
- 把同组所有字典的内容合并到基础键对应的字典里,最后删掉原来的后缀键
代码实现
def merge_associated_dicts(input_dict): # 定义所有允许的后缀类型 suffixes = ['Super', 'Duper', 'Uber'] # 复制原字典,避免直接修改原始数据 merged_dict = input_dict.copy() # 筛选出所有的基础键:排除那些是「基础键+后缀」形式的键 base_keys = [] for key in merged_dict.keys(): is_base = True for suffix in suffixes: if key.endswith(suffix): # 检查当前键是否是某个已存在的基础键加后缀 base_candidate = key[:-len(suffix)] if base_candidate in merged_dict: is_base = False break if is_base: base_keys.append(key) # 遍历每个基础键,合并同组字典 for base_key in base_keys: # 收集当前组的所有有效键 group_keys = [base_key] for suffix in suffixes: associated_key = base_key + suffix if associated_key in merged_dict: group_keys.append(associated_key) # 合并组内所有字典的内容 combined_content = {} for key in group_keys: combined_content.update(merged_dict[key]) # 更新基础键的内容 merged_dict[base_key] = combined_content # 删除组内的后缀键(只保留基础键) for key in group_keys[1:]: del merged_dict[key] return merged_dict # 测试用例 original_dict = { "item": {"foo": "bar", "fizz": "buzz"}, "itemSuper": {"boo": "far", "bizz": "fuzz"}, "itemDuper": {"omg": "wtf", "rofl": "lmao"}, "thingy": {"a": 1}, "thingyUber": {"b": 2}, "standalone": {"x": "y"} } result = merge_associated_dicts(original_dict) print(result)
代码解释
- 保护原始数据:先复制输入字典,避免操作过程中修改原数据
- 精准识别基础键:通过检查键是否是「基础键+后缀」的形式,排除掉所有带后缀的键,只保留真正的基础键
- 动态收集同组键:对每个基础键,自动生成所有可能的后缀组合键,只把存在于字典中的键纳入组内
- 合并与清理:用
update()方法合并组内所有字典的键值对,完成后删除多余的后缀键,只保留合并后的基础键条目
测试结果
运行代码后输出的结果完全符合需求:
{ "item": {"foo": "bar", "fizz": "buzz", "boo": "far", "bizz": "fuzz", "omg": "wtf", "rofl": "lmao"}, "thingy": {"a": 1, "b": 2}, "standalone": {"x": "y"} }
不管是带多个后缀的组、单个后缀的组,还是完全独立的键,都能正确处理。
内容的提问来源于stack exchange,提问作者user242007
相关产品推荐
相关产品推荐

