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

Python3:不使用for循环基于子字典键合并两个字典的优雅实现方案

优雅合并嵌套字典(无需显式遍历顶层键)

嘿,我懂你的痛点——Python自带的|运算符和update()方法在处理嵌套字典时,会直接用新字典里的子字典覆盖旧的,而不是合并子层级的键值对,而且你不想写那种手动遍历每个键的for循环。这里有几个简洁优雅的方案,帮你实现深层合并:

方案1:递归合并函数(无显式循环)

可以写一个递归函数,利用Python 3.9+的字典集合运算和推导式来处理深层合并,你不用手动遍历每个顶层键,逻辑全部由函数内部处理:

def deep_merge(a, b):
    return {
        key: deep_merge(a[key], b[key]) 
        if isinstance(a.get(key), dict) and isinstance(b.get(key), dict)
        else b.get(key, a[key])
        for key in a.keys() | b.keys()
    }

# 测试用例
dict1 = { 'APPL' : { 'cp': 1, 'sed': 'bull'}, 'BAC' : { 'cp': 1, 'sed': 'bull'}}
dict2 = { 'APPL' : { 'tp': 100}}

merged_dict = deep_merge(dict1, dict2)
print(merged_dict)
# 输出: {'APPL': {'cp': 1, 'sed': 'bull', 'tp': 100}, 'BAC': {'cp': 1, 'sed': 'bull'}}

这个函数的逻辑很清晰:如果某个键在两个字典里都是子字典,就递归合并它们;否则优先用b里的值,b没有的话就保留a的原值。字典推导式虽然底层有迭代,但这不属于你要避免的“手动遍历每个键”的显式循环,代码更简洁易读。

方案2:用functools.reduce批量合并多字典

如果你需要合并不止两个字典,用functools.reduce可以批量处理,同样不需要显式遍历键:

from functools import reduce

def merge_pair(a, b):
    return {
        key: merge_pair(a[key], b[key]) 
        if isinstance(a.get(key), dict) and isinstance(b.get(key), dict)
        else b.get(key, a[key])
        for key in a.keys() | b.keys()
    }

# 测试多字典合并
dict1 = { 'APPL' : { 'cp': 1, 'sed': 'bull'}, 'BAC' : { 'cp': 1, 'sed': 'bull'}}
dict2 = { 'APPL' : { 'tp': 100}}
dict3 = { 'BAC': {'vol': 5000}}

final_merged = reduce(merge_pair, [dict1, dict2, dict3])
print(final_merged)
# 输出: {'APPL': {'cp': 1, 'sed': 'bull', 'tp': 100}, 'BAC': {'cp': 1, 'sed': 'bull', 'vol': 5000}}

方案3:借助第三方库deepmerge(懒人首选)

如果不想自己写递归逻辑,成熟的第三方库deepmerge专门解决这类深层数据结构合并的问题,支持字典、列表等多种嵌套结构:

首先安装库:

pip install deepmerge

然后直接使用:

from deepmerge import always_merger

dict1 = { 'APPL' : { 'cp': 1, 'sed': 'bull'}, 'BAC' : { 'cp': 1, 'sed': 'bull'}}
dict2 = { 'APPL' : { 'tp': 100}}

merged = always_merger.merge(dict1, dict2)
print(merged)
# 输出: {'APPL': {'cp': 1, 'sed': 'bull', 'tp': 100}, 'BAC': {'cp': 1, 'sed': 'bull'}}

这个库还支持自定义合并策略,比如遇到列表是追加还是替换,非常灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:57:39