python:合并两本词典

本问题已经有最佳答案,请猛点这里访问。

我有两本字典如下:

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中实现这一点?


你可以试试:

1
2
3
D3 = {}
D3.update(D1)
D3.update(D2)

在这里,我们首先创建一个空字典D3,然后从其他两个字典更新它。

注意,您需要注意更新的顺序:如果D2D1共享一些键,上面的代码将用D2的相应条目覆盖D1的相应条目。

还要注意,键不会重复。您给出的示例D3={a:1,b:2,c:3,b:2,c:3,d:1}不是一个有效的字典。


I want to merge these two dictionaries and the result should be as
follows:

D3={'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}

how can I achieve this in python?

你不能。在Python dict中,每个键只能有一个值。

这里有一个例子与一套:

1
2
3
4
5
6
7
8
9
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:

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

你也可以用一个列表(可能更接近你的例子):

1
2
3
4
5
6
7
8
9
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)

你会得到:

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

但是,看看{'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}(它不可能是dict),您似乎在寻找完全不同的数据结构。也许是这样的:

1
2
3
4
5
6
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 ]

这将产生这样的结果,它看起来更接近您最初设想的数据结构:

1
2
3
4
5
6
[ {'value': 1, 'key': 'a'},
  {'value': 3, 'key': 'c'},
  {'value': 2, 'key': 'b'},
  {'value': 3, 'key': 'c'},
  {'value': 2, 'key': 'b'},
  {'value': 1, 'key': 'd'} ]


字典的定义不能有重复的键,所以"合并"字典实际上会给出以下结果(注意顺序是任意的):

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

你可以创建一个克隆的其中一个字典,并将条目从另一个合并到它:

1
2
D3 = dict(D1)
D3.update(D2)

或者您可以从每个输入字典的(key, value)元组的连接中创建一个新的字典:

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

如果你真的想要多个值的重复键,你需要像一个列表的值为每个键:

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

1
2
3
4
5
6
7
8
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}

更新

替代方案

1
2
3
4
5
6
7
8
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)

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

1
2
3
4
In [16]: D5 = dict(D1.items() + D2.items())

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


您所要求的是不可能的,因为在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 }