我需要合并多个词典,例如:
dict1 = {1:{"a":{A}}, 2:{"b":{B}}} dict2 = {2:{"c":{C}}, 3:{"d":{D}}
随着A B C和D作为树的叶子像{"info1":"value", "info2":"value2"}
{"info1":"value", "info2":"value2"}
词典的级别(深度)未知,可能是 {2:{"c":{"z":{"y":{C}}}}}
{2:{"c":{"z":{"y":{C}}}}}
在我的情况下,它代表目录/文件结构,其中节点为docs,而节点为文件。
我想将它们合并以获得:
dict3 = {1:{"a":{A}}, 2:{"b":{B},"c":{C}}, 3:{"d":{D}}}
我不确定如何使用Python轻松做到这一点。
这实际上是非常棘手的-特别是如果你希望在事物不一致时收到有用的错误消息,同时正确地接受重复但一致的条目(这里没有其他答案了……)。
假设你没有大量的条目,那么递归函数是最简单的:
def merge(a, b, path=None): "merges b into a" if path is None: path = [] for key in b: if key in a: if isinstance(a[key], dict) and isinstance(b[key], dict): merge(a[key], b[key], path + [str(key)]) elif a[key] == b[key]: pass # same leaf value else: raise Exception('Conflict at %s' % '.'.join(path + [str(key)])) else: a[key] = b[key] return a # works print(merge({1:{"a":"A"},2:{"b":"B"}}, {2:{"c":"C"},3:{"d":"D"}})) # has conflict merge({1:{"a":"A"},2:{"b":"B"}}, {1:{"a":"A"},2:{"b":"C"}})
请注意,这会发生变化a-将的内容b添加到a(也会返回)。如果你想保留a,可以这样称呼merge(dict(a), b)。
merge(dict(a), b)
agf指出(如下),你可能有两个以上的命令,在这种情况下,你可以使用:
agf
reduce(merge, [dict1, dict2, dict3...])
一切都将添加到dict1中。
[注意-我编辑了最初的答案以使第一个参数发生变化;使“减少”更易于解释]
python 3中的ps,你还需要 from functools import reduce
from functools import reduce