如何合并不同嵌套层级的嵌套字典?
嵌套字典的灵活合并方案
你遇到的这个问题太典型了——普通的dict.update()只做浅层次的键值覆盖,根本没法处理这种多层嵌套的字典合并需求。手动赋值虽然能解决一时,但层级变多或者字典结构复杂时完全不现实。这里给你一个通用的递归合并函数,能完美适配你提到的两种场景:
递归合并函数实现
这个函数会递归遍历嵌套字典的每一层:如果两个字典在同一个键下的值都是字典,就继续递归合并它们;如果不是,就直接用第二个字典的值(你也可以根据需求调整优先级,比如保留第一个字典的值)。
def merge_nested_dicts(d1, d2): # 先复制第一个字典,避免修改原字典 merged = d1.copy() for key, value in d2.items(): # 检查当前键是否在merged中,且两边都是字典类型 if key in merged and isinstance(merged[key], dict) and isinstance(value, dict): # 递归合并子字典 merged[key] = merge_nested_dicts(merged[key], value) else: # 非字典类型直接覆盖/添加 merged[key] = value return merged
场景1:合并第二层不同键的字典
针对你第一个例子,合并dict1和dict2,只需要调用这个函数:
dict1 = {'NYSE': {'day': {'USD': {'missing': ['z', 'y', 'x']}}}} dict2 = {'NYSE': {'hour': {'USD': {'missing': ['z', 'y', 'x']}}}} result = merge_nested_dicts(dict1, dict2) print(result)
输出结果完全符合你的预期:
{'NYSE': {'day': {'USD': {'missing': ['z', 'y', 'x']}}, 'hour': {'USD': {'missing': ['z', 'y', 'x']}}}}
场景2:合并同一第二层键下的子字典
对于第二个场景,合并dict1和dict3,同样用这个函数就能自动合并同一day键下的子字典:
dict1 = {'NYSE': {'day': {'USD': {'missing': ['z', 'y', 'x']}}}} dict3 = {'NYSE': {'day': {'EUR': {'missing': ['z', 'y', 'x']}}}} result = merge_nested_dicts(dict1, dict3) print(result)
输出结果:
{'NYSE': {'day': {'USD': {'missing': ['z', 'y', 'x']}, 'EUR': {'missing': ['z', 'y', 'x']}}}}
额外小提示
如果你使用的是Python 3.9及以上版本,虽然原生的|运算符(或|=)也是合并字典,但它同样是浅合并,没法处理嵌套结构。所以上面的递归函数依然是最灵活的解决方案,不管你的字典嵌套多少层,它都能正确处理合并逻辑。
内容的提问来源于stack exchange,提问作者Florent
相关产品推荐
相关产品推荐

