2015-06-27 65 views
2


合并两个库的价值,我有两个字典:联盟的关键

d1 = {'a':('x','y'),'b':('k','l')} 
d2 = {'a':('m','n'),'c':('p','r')} 

如何合并这两个库得到这样的结果:

d3 = {'a':('x','y','m','n'),'b':('k','l'),'c':('p','r')} 

这个工作的时候值字典是简单类型,如int或str:

d3 = dict([(i,a[i]+b[i]) for i in set(a.keys()+b.keys())]) 

但我不知道如何与列表作为值处理...

注意:我的问题是How to merge two Python dictionaries in a single expression?不同,因为我不想更新值,但将它们添加

+1

可能的重复。这应该回答你的问题:http://stackoverflow.com/questions/38987/how-can-i-merge-two-python-dictionaries-in-a-single-expression – 2015-06-27 21:24:25

+1

@gargas我不认为这是重复的。您引用的问题是最后一个赢,而不是价值合并。 –

回答

3

你的问题是有点错位相对于变量名,但我认为这你想要做什么:

d3 = dict([(i,d1.get(i,())+d2.get(i,())) for i in set(d1.keys()+d2.keys())]) 
d3 
{'a': ('x', 'y', 'm', 'n'), 'b': ('k', 'l'), 'c': ('p', 'r')} 

请注意,您可以添加(即扩展)list s和tuples+

1

有在添加名单没有问题Python(它连接它们);但是,决定何时添加还有一点问题,因为只有当密钥出现在两个字典中时才应该这样做。

d3 = dict(
    [(i, d1[i]+d2[i]) for i in set(d1.keys()).intersection(d2.keys())] +\ 
    [(i, d1[i]) for i in set(d1.keys()) - set(d2.keys())] +\ 
    [(i, d2[i]) for i in set(d2.keys()) - set(d1.keys())]) 
>> d3 
{'a': ('x', 'y', 'm', 'n'), 'b': ('k', 'l'), 'c': ('p', 'r')} 
+2

您可以使用'd1.viewkeys()&d2.viewkeys()'... –

+2

谢谢,@PadraicCunningham - 总是向您学习! –

1

两件事情:

  1. 可以只需添加列表和元组,应该工作。

    In [5]: ('x','y') + ('m','n')

    Out[5]: ('x', 'y', 'm', 'n')

  2. d3 = dict([(i,a[i]+b[i]) for i in set(a.keys()+b.keys())])未能在关键只在ab但不能同时显示了任何情况下。价值在这里是无关紧要的。

个人而言,我喜欢的东西去:

d3 = {} 

for i in set(a.keys()+b.keys()): 
    val1 = a[i] if i in a else() 
    val2 = b[i] if i in b else() 
    d3[i] = val1+val2 
1

你可以使用字典。用viewitems for循环:

d1 = {'a': ('x', 'y'), 'b': ('k', 'l')} 
d2 = {'a': ('m', 'n'), 'c': ('p', 'r')} 

d3 = {} 

for key, item in d1.viewitems() | d2.viewitems(): 
    d3[key]= d3.get(key,()) + item 

print(d3) 

{'a': ('x', 'y', 'm', 'n'), 'c': ('p', 'r'), 'b': ('k', 'l')} 

或者使用defaultdict:

from collections import defaultdict 
d3 = defaultdict(tuple) 
for key, item in d1.viewitems() | d2.viewitems(): 
    d3[key] += item 

print(d3) 

或者使用viewkeys为名单,因为它们不是可哈希:

d1 = {'a': ['x', 'y'], 'b': ['k', 'l']} 
d2 = {'a': ['m', 'n'], 'c': ['p', 'r']} 


d3 = {} 

for key in d1.viewkeys() | d2.viewkeys(): 
    d3[key] = d1.get(key, []) + d2.get(key, []) 

print(d3) 

,你可以作为一个写字典comp:

d3 = {key:d1.get(key, []) + d2.get(key, []) for key in d1.viewkeys() | d2.viewkeys()} 

for列出你也可以链中的物品:

d1 = {'a': ['x', 'y'], 'b': ['k', 'l']} 
d2 = {'a': ['m', 'n'], 'c': ['p', 'r']} 


from collections import defaultdict 
d3 = defaultdict(list) 
from itertools import chain 
for key, v in chain.from_iterable((d1.items(),d2.items())): 
    d3[key] += v 

print(d3) 

defaultdict(<type 'list'>, {'a': ['x', 'y', 'm', 'n'], 'c': ['p', 'r'], 'b': ['k', 'l']}) 

对于python3只使用.items.keys他们返回dictview对象。