【问题标题】:How can I merge two nested dictionaries together?如何将两个嵌套字典合并在一起?
【发布时间】:2015-03-24 19:29:22
【问题描述】:

我有两个嵌套字典,它们在第一级具有重叠的键,但在第二级具有不同的键。我想合并它们,以便新字典包含所有键。

A = {'id1': {'key1': 1, 'key2': 2 }, 'id2':{'key1': 3, 'key2': 4 }}
B = {'id1': {'key3': 5}, 'id2': {'key3': 6}}

结果应该是

A_B = {'id1': {'key1': 1, 'key2': 2, 'key3': 5}, 'id2':{'key1': 3, 'key2': 4, 'key3': 6}}

我知道我可以做一个for 循环

for key in A:
    A[key].update(B[key])

但我想知道是否有更清洁的解决方案。

【问题讨论】:

    标签: python dictionary collections


    【解决方案1】:

    您可以将它们合并到字典理解中:

    A_B = {k: dict(A.get(k, {}), **B.get(k, {})) for k in A.viewkeys() | B.viewkeys()}
    

    这使用 Python 2 dictionary keys view object;在 Python 3 中,使用 dict.keys() 而不是 dict.viewkeys()

    这将合并所有键,即使它们只出现在一个或另一个字典中。

    使用您的输入进行演示:

    >>> A = {'id1': {'key1': 1, 'key2': 2 }, 'id2':{'key1': 3, 'key2': 4 }}
    >>> B = {'id1': {'key3': 5}, 'id2': {'key3': 6}}
    >>> {k: dict(A.get(k, {}), **B.get(k, {})) for k in A.viewkeys() | B.viewkeys()}
    {'id2': {'key3': 6, 'key2': 4, 'key1': 3}, 'id1': {'key3': 5, 'key2': 2, 'key1': 1}}
    

    或使用更多不同的键输入:

    >>> C = {'foo': {'spam': 1, 'ham': 2}, 'bar': {'spam': 43, 'eggs': 81}}
    >>> D = {'baz': {'vikings': 'singing'}, 'bar': {'monty': 'python'}}
    >>> {k: dict(C.get(k, {}), **D.get(k, {})) for k in C.viewkeys() | D.viewkeys()}
    {'bar': {'eggs': 81, 'monty': 'python', 'spam': 43}, 'foo': {'ham': 2, 'spam': 1}, 'baz': {'vikings': 'singing'}}
    

    【讨论】:

    【解决方案2】:
    1. 迭代字典B
    2. 检查B 中的密钥是否存在于A- 异常处理
    3. 如果是,则将A 的相应值更新为B
    4. 如果不是,则添加值在A 中的新键

    代码:

    >>> A = {'id1': {'key1': 1, 'key2': 2 }, 'id2':{'key1': 3, 'key2': 4 }}
    >>> B = {'id1': {'key3': 5}, 'id2': {'key3': 6}}
    >>> for i, j in B.items(): 
    ...      if i in A:
    ...          A[i].update(j)
    ...      else:
    ...          A[i] = j
    ... 
    >>> A
    {'id2': {'key3': 6, 'key2': 4, 'key1': 3}, 'id1': {'key3': 5, 'key2': 2, 'key1': 1}}
    >>> 
    

    【讨论】:

    • 这比我举个例子的 for 循环有什么好处?
    • @2cents:如果BA 中不存在的密钥,那么这将不会出现在输出中。
    • @2cents:当A[key].update(B[key]) 语句中的键中不存在键时,您不处理异常。这将引发KeyError 异常。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2012-09-20
    • 2021-04-03
    • 2022-01-15
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多