gpt4 book ai didi

python - 如何合并字典的字典?

转载 作者:IT老高 更新时间:2023-10-28 21:07:19 25 4
gpt4 key购买 nike

我需要合并多个字典,例如:

dict1 = {1:{"a":{A}}, 2:{"b":{B}}}

dict2 = {2:{"c":{C}}, 3:{"d":{D}}

A B CD 是树的叶子,例如 {"info1 ":"value", "info2":"value2"}

字典的级别(深度)未知,可能是 {2:{"c":{"z":{"y":{C}}}}}

在我的例子中,它代表一个目录/文件结构,其中节点是文档,叶子是文件。

我想合并它们以获得:

 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).

agf 指出(下)你可能有两个以上的字典,在这种情况下你可以使用:

reduce(merge, [dict1, dict2, dict3...])

所有内容都将添加到 dict1

注意:我编辑了最初的答案以改变第一个参数;这使得“减少”更容易解释

PS:在python 3中,你还需要from functools import reduce

关于python - 如何合并字典的字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7204805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com