2015-06-27 66 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對象。