这实际上是非常棘手的-特别是如果你希望在事物不一致时收到有用的错误消息,同时正确地接受重复但一致的条目(这里没有其他答案了……)。
假设你没有大量的条目,那么递归函数是最简单的:
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# worksprint(merge({1:{"a":"A"},2:{"b":"B"}}, {2:{"c":"C"},3:{"d":"D"}}))# has conflictmerge({1:{"a":"A"},2:{"b":"B"}}, {1:{"a":"A"},2:{"b":"C"}})请注意,这会发生变化a-将的内容b添加到a(也会返回)。如果你想保留a,可以这样称呼
merge(dict(a), b)。
agf指出(如下),你可能有两个以上的命令,在这种情况下,你可以使用:
reduce(merge, [dict1, dict2, dict3...])
一切都将添加到dict1中。
[注意-我编辑了最初的答案以使第一个参数发生变化;使“减少”更易于解释]
python 3中的ps,你还需要
from functools import reduce



