合并两个字典

20
我有两个字典,分别如下: D1={'a':1,'b':2,'c':3}D2={'b':2,'c':3,'d':1} 我想合并这两个字典,结果应该如下: D3={'a':1,'b':2,'c':3,'b':2,'c':3,'d':1} 在python中,我该如何实现呢?

6
{'a':1,'b':2,'c':3,'b':2,'c':3,'d':1} 不是 Python 字典。 - eumiro
我遇到了类似的问题。它是什么? - El_1988
5个回答

11
我想合并这两个字典,结果应该如下:
D3={'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}
在Python中,你不能这样做。在Python dict中每个key只能对应一个value。你可以用列表或集合作为值来实现相似的功能。
以下是使用集合的示例:
d1 = { 'a': 1, 'b': 2, 'c': 3 }
d2 = { 'a': 1, 'b': 5, 'd': 4 }
d3 = {}
def add_dict(target, d):
    for key in d:
        target.setdefault(key, set([])).add(d[key])

add_dict(d3, d1)
add_dict(d3, d2)

这将给你d3

{'a': set([1]), 'c': set([3]), 'b': set([2, 5]), 'd': set([4])}

你也可以使用列表来实现这个功能(可能更接近你的示例):

d1 = { 'a':1, 'b':2, 'c': 3}
d2 = { 'b':2 ,'c':3, 'd': 1}
d3 = {}
def add_dict(target, d):
    for key in d:
        target.setdefault(key, []).append(d[key])

add_dict(d3, d1)
add_dict(d3, d2)

你将得到这个:

{'a': [1], 'c': [3, 3], 'b': [2, 2], 'd': [1]}

然而,如果看一下 {'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}(这不可能是一个字典),似乎你想要的是完全不同的数据结构。也许像这样:

d1 = { 'a':1, 'b':2, 'c': 3}
d2 = { 'b':2 ,'c':3, 'd': 1}
result = []

result += [ { 'key': key, 'value': d1[key] } for key in d1 ]
result += [ { 'key': key, 'value': d2[key] } for key in d2 ]
这将产生以下结果,看起来更接近于你最初考虑的数据结构:
[ {'value': 1, 'key': 'a'},
  {'value': 3, 'key': 'c'},
  {'value': 2, 'key': 'b'},
  {'value': 3, 'key': 'c'},
  {'value': 2, 'key': 'b'},
  {'value': 1, 'key': 'd'} ]

我测试了一下,似乎缺少了一些东西,因为我确实键入了以下内容:type({0.8080260303687652: 2e-05, 0.8069414316702677: 1e-05, 0.8091106290672485: 1e-05, 0.8156182212581342: 1e-05}) ,但结果是'dict'。所以显然它可以是一个字典? - El_1988
@El_1988,除非我漏掉了什么,否则你的示例中所有键都是不同的。每个键只有一个值。 - Bruno

6

您可以尝试以下方法:

D3 = {}
D3.update(D1)
D3.update(D2)

在这里,我们首先创建一个空字典D3,然后从另外两个字典中更新它。
请注意,您需要小心更新的顺序:如果D2D1共享某些键,则上面的代码将用D2的相应条目覆盖D1的条目。
还要注意,键不会重复。您提供的示例D3={a:1,b:2,c:3,b:2,c:3,d:1}不是有效的字典。

+1 -- 但是如果你在解释器中输入D3={a:1,b:2,c:3,b:2,c:3,d:1},它会欣然接受(前提是a,b,c,d已经定义且可哈希)。据我所知,这是构建字典的有效表达式(尽管我不确定标准是否明确规定对于重复键应该取第一个值还是最后一个值,或者是“随机”的)。 - mgilson

4
按照定义,字典无法具有重复的键,因此“合并”字典实际上会产生以下结果(请注意,顺序是任意的):
{'a': 1, 'b': 2, 'c': 3, 'd': 1}

你可以创建一个字典的副本,并将另一个字典的条目合并到其中:
D3 = dict(D1)
D3.update(D2)

或者您可以通过将每个输入字典的(键,值)元组连接起来创建一个新字典:

D3 = dict(D1.items() + D2.items())

如果您确实想要重复键的多个值,您需要像每个键的值列表这样的东西:

from itertools import groupby
dict(( (key, [v for k, v in group]) for key, group in groupby(sorted(D1.items() + D2.items()), lambda x: x[0])))

2
In [3]: D1={'a':1,'b':2,'c':3}

In [4]: D2={'b':2,'c':3,'d':1}

In [5]: D1.update(D2)

In [6]: D1
Out[6]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}

更新

备选方案

In [9]: D3=D1.copy()

In [10]: D3.update(D2)

In [11]: D3
Out[11]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}

In [12]: D4=dict(D1, **D2)

或者

In [13]: D4
Out[13]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}

或者

In [16]: D5 = dict(D1.items() + D2.items())

In [17]: D5
Out[17]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}

1
...它修改D1。最好先复制一份。 - Pierre GM
只是在IPython中进行了一个快速的会话;这里有4个或多或少相同的答案 :-) - Fredrik Pihl

2
你所询问的是不可能的,因为在Python字典中无法有两个不同的键具有相同的值。
最接近你问题的答案是: D3 = dict( D1.items() + D2.items() ) 注意: 如果你有相同键的不同值,则D2中的值将成为D3中的值。
例如:
D1 = { 'a':1, 'b'=2 }
D2 = { 'c':3, 'b':3}
那么,D3将变为:
D3= { 'a':1, 'b':3, 'c':3 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接