2012-09-20 83 views
0

我有两个字典如下:合并两个词典

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

回答

2

我想这两个字典合并,结果笑如下所示:

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

我该如何在Python中实现这一点?

你不行。在Python字典中,每个键只能有一个值。你可以做的是有一个列表或一组作为价值。

下面是一组一个例子:

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

您可能也想尝试:

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

在这里,我们要创建一个空的字典D3第一,然后从其他两个字典更新。

请注意,你需要小心的更新的顺序:如果D2股有些键与D1,上面的代码将覆盖的D1相应的条目与那些D2

请注意,密钥将重复而不是。你给D3={a:1,b:2,c:3,b:2,c:3,d:1}的例子不是有效的字典。

+0

+1 - 但是如果你在解释器中键入'D3 = {a:1,b:2,c:3,b:2,c:3,d:1}',它会很高兴地允许它a,b,c,d'被定义和可排除)。据我所知,它*是一个构造* a *字典的有效表达式(尽管我不确定标准是否明确说明了您是将第一个值用于重复键还是最后一个,或者是否为“随机”)。 – mgilson

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 }

2

词典定义不能有重复键,所以 “合并” 字典实际上给出的结果(注该订单是任意的):

{'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]))) 
1
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'。首先制作副本可能更明智。 –

+0

是真的,只是在ipython中快速会话; 4个或多或少相同的答案在这里:-) –