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

如何在Python中智能合并多层嵌套的配置对象?

实现配置的智能嵌套合并

需求分析

需要基于基础配置列表,通过覆盖配置列表完成嵌套式合并,核心规则:

  • 列表按索引一一对应合并,每个位置的字典执行嵌套处理
  • 字典:键已存在时,若值同为字典则递归合并,否则直接覆盖;键不存在时新增
  • 仅执行添加/覆盖操作,不删除原有内容

实现代码

def merge_dicts(base: dict, override: dict) -> dict:
    """递归合并两个字典,仅覆盖或新增键值对"""
    merged = base.copy()
    for key, value in override.items():
        # 嵌套字典递归合并
        if key in merged and isinstance(merged[key], dict) and isinstance(value, dict):
            merged[key] = merge_dicts(merged[key], value)
        else:
            # 非字典类型直接覆盖,或新增键
            merged[key] = value
    return merged

def smart_merge(base_conf: list[dict], override_conf: list[dict]) -> list[dict]:
    """合并两个配置列表,按索引对应处理每个字典元素"""
    merged_list = []
    max_len = max(len(base_conf), len(override_conf))
    for i in range(max_len):
        # 处理列表长度不一致的情况,超出部分用空字典兜底
        base_item = base_conf[i] if i < len(base_conf) else {}
        override_item = override_conf[i] if i < len(override_conf) else {}
        merged_list.append(merge_dicts(base_item, override_item))
    return merged_list

测试验证

用你提供的示例代码测试:

base_conf = [
  {'a': 'foo', 'b': 12, 'c': {'x': 1, 'y': 2}, 'd': [1, 2, 3]},
  {'a': 'bar', 'd': [10, 20]}
]

conf = {
  'conf1': smart_merge(base_conf, [
    {'b': 24, 'c': {'y': 20}},
    {'c': {'x': 10, 'z': 30}}
  ]),
}

# 输出结果
print(conf['conf1'])

输出结果与预期完全一致:

[
  {'a': 'foo', 'b': 24, 'c': {'x': 1, 'y': 20}, 'd': [1, 2, 3]},
  {'a': 'bar', 'c': {'x': 10, 'z': 30}, 'd': [10, 20]}
]

额外说明

  • 若覆盖列表长度大于基础列表,超出索引的覆盖配置元素会直接作为新项加入结果
  • 若基础列表长度大于覆盖列表,超出索引的基础配置元素会原样保留
  • 对于列表类型的值,当前逻辑是直接替换(若需要列表合并/追加,可扩展merge_dicts函数,判断值为列表时执行对应操作)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:55:25