在Python 2.7中合并多嵌套字典的最佳方法

时间:2015-04-24 12:05:24

标签: python python-2.7 dictionary merge

我有两个嵌套的词典,我想将它们合并为一个(第二个dict覆盖第一个dict值)。我看到很多漂亮的解决方案,用于合并" flat" (不是嵌套的)词典,例如:

dict_result = dict1.copy()
dict_result.update(dict2)

dict_result = dict(dict1.items() + dict2.items())

或(我最喜欢的)

dict_result = dict(d1,**d2)

但无法找到合并多嵌套词组的最有效方法。

我试图避免递归。你的主张是什么?

2 个答案:

答案 0 :(得分:9)

除非严格限制合并词典的深度,否则无法避免递归。 1)此外,没有bultin或库函数来执行此操作(也就是说,我不知道),但实际上并不是那么难。这样的事情应该做:

def merge(d1, d2):
    for k in d2:
        if k in d1 and isinstance(d1[k], dict) and isinstance(d2[k], dict):
            merge(d1[k], d2[k])
        else:
            d1[k] = d2[k]   

这样做:它迭代d2中的密钥,如果密钥也可以在d1中找到并且都是字典,则合并这些子字典,否则覆盖{{1}中的值来自d1的那个。请注意,这会更改d2及其子词典到位,因此您可能希望以前对其进行深层复制。

或使用此版本创建合并副本:

d1

示例:

def merge_copy(d1, d2):
    return {k: merge_copy(d1[k], d2[k]) if k in d1 and isinstance(d1[k], dict) and isinstance(d2[k], dict) else d2[k] for k in d2}

1)可以使用堆栈进行迭代,但这只会使事情变得更复杂,并且应该只是为了避免最大递归深度的问题。

答案 1 :(得分:0)

上述merge_copy函数的修改版本,可以被认为是合并父级和子级,您希望父级继承子级的所有值以创建新的dict。

def merge_copy(child, parent):
    '''returns parent updated with child values if exists'''
    d = {}
    for k in parent:
        if k in child and isinstance(child[k], dict) and isinstance(parent[k], dict):
            v = merge_copy(child[k], parent[k])
        elif k in child:
            v = child[k]
        else:
            v = parent[k]
        d[k] = v
    return d