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

Python 3.5合并嵌套字典求Union All:问题及实现方法咨询

合并嵌套字典的几种实现方法(Python 3.5+)

嘿,我懂你想要的是把两个嵌套字典做全量合并——也就是不管层级,所有键都保留,嵌套的子字典也得跟着合并对吧?下面给你几种适配Python 3.5的实现方法,包括你特意提到的for loop版本,还有更通用的递归方案。

1. 递归实现(通用型,支持任意层级嵌套)

递归是处理嵌套结构最灵活的方式,能自动适配任意深度的字典层级。逻辑很简单:遍历第二个字典的每一项,遇到嵌套子字典就递归合并,非字典值则直接保留(冲突时默认用第二个字典的值,你也可以根据需求调整)。

def merge_nested_dicts(d1, d2):
    # 先复制第一个字典,避免修改原数据
    merged = d1.copy()
    for key, value in d2.items():
        # 如果当前键在第一个字典中,且两边都是字典,递归合并子字典
        if isinstance(value, dict) and key in merged and isinstance(merged[key], dict):
            merged[key] = merge_nested_dicts(merged[key], value)
        else:
            # 否则直接添加/覆盖值
            merged[key] = value
    return merged

测试示例

dict1 = {"a": 1, "b": {"x": 2, "y": 3}}
dict2 = {"b": {"y": 4, "z": 5}, "c": 6}
result = merge_nested_dicts(dict1, dict2)
print(result)
# 输出: {'a': 1, 'b': {'x': 2, 'y': 4, 'z': 5}, 'c': 6}

如果想要完全的「union all」——也就是冲突时保留所有值而不是覆盖,可以稍微修改逻辑,把冲突值合并成列表:

def merge_nested_dicts_union_all(d1, d2):
    merged = d1.copy()
    for key, value in d2.items():
        if isinstance(value, dict) and key in merged and isinstance(merged[key], dict):
            merged[key] = merge_nested_dicts_union_all(merged[key], value)
        elif key in merged:
            # 把冲突值转为列表并合并
            if not isinstance(merged[key], list):
                merged[key] = [merged[key]]
            merged[key].append(value)
        else:
            merged[key] = value
    return merged

测试这个版本:

dict1 = {"a": 1, "b": {"y": 3}}
dict2 = {"a": 2, "b": {"y": 4}}
result = merge_nested_dicts_union_all(dict1, dict2)
print(result)
# 输出: {'a': [1, 2], 'b': {'y': [3, 4]}}

2. For循环实现(适合固定层级的嵌套)

如果你的字典嵌套层级是固定的(比如最多两层),可以用嵌套for循环手动处理,逻辑更直观:

def merge_two_level_dicts(d1, d2):
    merged = d1.copy()
    # 遍历顶层键
    for key, value in d2.items():
        if key not in merged:
            merged[key] = value
        else:
            # 如果都是子字典,遍历第二层键合并
            if isinstance(merged[key], dict) and isinstance(value, dict):
                for sub_key, sub_value in value.items():
                    merged[key][sub_key] = sub_value
            else:
                # 非字典值直接覆盖(也可以改成合并列表)
                merged[key] = value
    return merged

这个方法的好处是代码直白,但如果字典层级更深,就需要嵌套更多的for循环,灵活性不如递归。用之前的测试例子跑,结果和递归版本一致。

3. 小提示:Python 3.5的局限性

注意Python 3.5还没有引入字典合并运算符|(3.9+才支持),所以不能用d1 | d2这种简洁的方式;另外dict.update()只能处理顶层键,嵌套的子字典会被直接覆盖,所以不适合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:03:04