You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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}}

逻辑说明

  1. 遍历所有映射,收集所有顶级键,确保不会遗漏任何映射中的键
  2. 对每个顶级键,收集所有映射中该键对应的取值
  3. 如果所有取值都是字典,递归用DeepChainMap合并这些子字典,保证多层嵌套也能正确合并
  4. 如果存在非字典的取值,保持ChainMap的原有优先级,返回第一个出现的取值

内容的提问来源于stack exchange,提问作者HJA24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 01:52:14