如何将两个嵌套的词典合并在一起?

时间:2015-03-24 19:29:23

标签: python dictionary collections

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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'}}

答案 1 :(得分:1)

  1. 迭代字典B
  2. 检查B中是否存在来自A的密钥 - 例外处理
  3. 如果是,则按A更新B的相应值。
  4. 如果不是,则使用A
  5. 中的值添加新密钥

    代码:

    >>> 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}}
    >>>