首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何合并字典中的字典?

如何合并字典中的字典?
EN

Stack Overflow用户
提问于 2011-08-26 20:44:31
回答 30查看 93.8K关注 0票数 176

我需要合并多个字典,下面是我所拥有的示例:

代码语言:javascript
运行
复制
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}}}}}

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

我想合并它们以获得:

代码语言:javascript
运行
复制
 dict3 = {1:{"a":{A}}, 2:{"b":{B},"c":{C}}, 3:{"d":{D}}}

我不确定如何使用Python轻松做到这一点。

EN

回答 30

Stack Overflow用户

回答已采纳

发布于 2011-08-26 21:08:48

这实际上是相当棘手的--特别是当你想要一个有用的错误消息时,当事情不一致的时候,同时正确地接受重复但一致的条目(这是这里没有其他答案做的……)

假设你没有大量的条目,递归函数是最简单的:

代码语言:javascript
运行
复制
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指出(如下),你可能有两个以上的字典,在这种情况下,你可以使用:

代码语言:javascript
运行
复制
reduce(merge, [dict1, dict2, dict3...])

其中所有内容都将添加到dict1中。

注意--我编辑了我的初始答案,修改了第一个参数;这使得"reduce“更容易解释

ps在Python3中,您还需要from functools import reduce

票数 174
EN

Stack Overflow用户

发布于 2011-08-26 21:50:43

这里有一个使用生成器的简单方法:

代码语言:javascript
运行
复制
def mergedicts(dict1, dict2):
    for k in set(dict1.keys()).union(dict2.keys()):
        if k in dict1 and k in dict2:
            if isinstance(dict1[k], dict) and isinstance(dict2[k], dict):
                yield (k, dict(mergedicts(dict1[k], dict2[k])))
            else:
                # If one of the values is not a dict, you can't continue merging it.
                # Value from second dict overrides one in first and we move on.
                yield (k, dict2[k])
                # Alternatively, replace this with exception raiser to alert you of value conflicts
        elif k in dict1:
            yield (k, dict1[k])
        else:
            yield (k, dict2[k])

dict1 = {1:{"a":"A"},2:{"b":"B"}}
dict2 = {2:{"c":"C"},3:{"d":"D"}}

print dict(mergedicts(dict1,dict2))

这将打印:

代码语言:javascript
运行
复制
{1: {'a': 'A'}, 2: {'c': 'C', 'b': 'B'}, 3: {'d': 'D'}}
票数 40
EN

Stack Overflow用户

发布于 2019-10-02 13:16:04

你可以试试。

Installation

代码语言:javascript
运行
复制
$ pip3 install mergedeep

使用

代码语言:javascript
运行
复制
from mergedeep import merge

a = {"keyA": 1}
b = {"keyB": {"sub1": 10}}
c = {"keyB": {"sub2": 20}}

merge(a, b, c) 

print(a)
# {"keyA": 1, "keyB": {"sub1": 10, "sub2": 20}}

有关选项的完整列表,请查看docs!

票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7204805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档