如何修改DeepChainMap类实现同键嵌套字典的合并?
解决嵌套字典的DeepChainMap合并问题
默认的ChainMap只会按映射优先级返回第一个匹配的键值,不会合并同顶级键对应的子字典;普通的DeepChainMap通常仅支持递归查找嵌套键,无法实现子字典的合并需求。要达成目标,需要修改DeepChainMap,在生成完整字典时主动收集所有映射中同顶级键的子字典并递归合并。
修改后的DeepChainMap实现
from collections import ChainMap class DeepChainMap(ChainMap): def to_dict(self): merged = {} # 收集所有映射中的顶级键 all_top_keys = set() for mapping in self.maps: all_top_keys.update(mapping.keys()) for key in all_top_keys: # 收集所有映射中该键对应的取值 key_values = [] for mapping in self.maps: if key in mapping: key_values.append(mapping[key]) # 若所有取值都是字典,则递归合并 if all(isinstance(val, dict) for val in key_values): merged[key] = DeepChainMap(*key_values).to_dict() else: # 非字典类型保持ChainMap的优先级,取第一个出现的值 merged[key] = self[key] return merged
验证效果
基础嵌套场景
a = {'x': {'a': 1}, 'y': {'b': 2}} b = {'x': {'c': 3}, 'z': {'d': 4}} deep_cm = DeepChainMap(a, b) print(deep_cm.to_dict()) # 输出:{'x': {'a': 1, 'c': 3}, 'y': {'b': 2}, 'z': {'d': 4}}
多层嵌套场景
a = {'x': {'a': {'i': 1}, 'b': 2}} b = {'x': {'a': {'j': 2}, 'c': 3}, 'y': {'d': 4}} deep_cm = DeepChainMap(a, b) print(deep_cm.to_dict()) # 输出:{'x': {'a': {'i': 1, 'j': 2}, 'b': 2, 'c': 3}, 'y': {'d': 4}}
逻辑说明
- 遍历所有映射,收集所有顶级键,确保不会遗漏任何映射中的键
- 对每个顶级键,收集所有映射中该键对应的取值
- 如果所有取值都是字典,递归用
DeepChainMap合并这些子字典,保证多层嵌套也能正确合并 - 如果存在非字典的取值,保持
ChainMap的原有优先级,返回第一个出现的取值
内容的提问来源于stack exchange,提问作者HJA24
相关产品推荐
相关产品推荐

