2016-03-16 99 views
3

我想合併兩個字典是這樣的:合併2個字典在Python這樣

來自:

a1 = {u'2016-03-11': [u'20:00', u'22:10']} 
    a2 = {u'2016-03-11': [u'20:00', u'23:10'],u'2016-03-12': [u'20:00', u'22:10']} 

到:

an = {u'2016-03-11': [u'20:00',u'22:10', u'23:10'],u'2016-03-12': [u'20:00', u'22:10']} 

我需要一個函數合併兩個字典

回答

1
from collections import defaultdict 


a1 = {u'2016-03-11': [u'20:00', u'22:10']} 
a2 = {u'2016-03-11': [u'20:00', u'23:10'],u'2016-03-12': [u'20:00', u'22:10']}  

dd = defaultdict(set) 
for d in a1, a2: 
    for k, v in d.items(): 
     dd[k] |= set(v) 
res = {k: sorted(v) for k, v in dd.items()} 

print(res) 
# {'2016-03-12': ['20:00', '22:10'], '2016-03-11': ['20:00', '22:10', '23:10']} 
+1

'sorted(list(v))''可以簡化爲'sorted(v)' – falsetru

+0

@falsetru,修正,謝謝。 –

1

使用set,sorted將兩個列表合併爲一個並排序:

>>> a1 = {u'2016-03-11': [u'20:00', u'22:10']} 
>>> a2 = {u'2016-03-11': [u'20:00', u'23:10'],u'2016-03-12': [u'20:00', u'22:10']} 


>>> an = {} 
>>> for d in a1, a2: 
...  for key in d: 
...   an[key] = sorted(set(an.get(key, []) + d[key])) 
...   # ^^ Merge two lists (dictionary values) into one, and sort 
... 
>>> print an 
{u'2016-03-11': [u'20:00', u'22:10', u'23:10'], 
u'2016-03-12': [u'20:00', u'22:10']} 

UPDATE

使用字典解析

替代版本(假設合併只有兩個詞典):

>>> {key: sorted(set(a1.get(key,[]) + a2.get(key,[]))) for key in set(a1)|set(a2)} 
{u'2016-03-11': [u'20:00', u'22:10', u'23:10'], 
u'2016-03-12': [u'20:00', u'22:10']} 
+0

如果不使用,我可以做「爲」,以及如何? –

+0

@VityLin,你需要以任何方式迭代字典。這是不可避免的。 – falsetru

+0

@VityLin,我添加了一個不使用'for'循環,但字典理解的版本。 (但它仍然迭代) – falsetru

1
a1 = {u'2016-03-11': [u'20:00', u'22:10']} 
a2 = {u'2016-03-11': [u'20:00', u'23:10'],u'2016-03-12': [u'20:00', u'22:10']} 


import copy 
an = copy.deepcopy(a1) 

for key, value in a2.iteritems(): 
    if key in an: 
     an[key] = list(set(an[key] + a2[key])) 
    else: 
     an[key] = value 

print an 

>> {u'2016-03-11': [u'22:10', u'20:00', u'23:10'], u'2016-03-12': [u'20:00', u'22:10']} 
-1

它看起來可怕,但它的工作原理:

an = {} 
for key in set(list(a1.keys()) + list(a2.keys())): 
    an[key] = list(set((a1.get(key) or []) + (a2.get(key) or []))) 

我舒爾有更聰明和Python的方式,雖然:)

+1

迭代字典會產生鍵:'keys()'不是必需的。對於set(list(a1)+ list(a2))中的鍵,使用'dict.get(key,default)'而不是'dict.get(key)或default':':an [key] = list(set (a1.get(key)or [])a1.get(key,[])+ a2.get(key,[])))' – falsetru

+1

1.' [獲取採用默認參數時,找不到密鑰] 2. set()。union(a1.keys(),a2.keys())'(或'set()。union(a1.keys ))。union(a2.keys())'if if> 2.6)not'set(list(a1.keys())+ list(a2.keys()))'[避免創建3個列表和1個集合對於1個空集和至多2個部分填充的集合] –

+1

並且包括什麼falsetru給出:'對於集合中的鍵()。union(a1,a2):an [key] = list(set()。union(a1.get (key,[]),a2.get(key,[])))' –

0

我得出這個選項(在這裏張貼的答案):

an = {} 
for key in set().union(a1, a2): 
    an[key] = sorted(set().union(a1.get(key, []), a2.get(key, []))) 

它建立的集而不用列表級聯。

它產生所需的結果:

>>> a1 = {u'2016-03-11': [u'20:00', u'22:10']} 
>>> a2 = {u'2016-03-11': [u'20:00', u'23:10'],u'2016-03-12': [u'20:00', u'22:10']} 
>>> an = {} 
>>> for key in set().union(a1, a2): 
...  an[key] = sorted(set().union(a1.get(key, []), a2.get(key, []))) 
... 
>>> an 
{u'2016-03-11': [u'20:00', u'22:10', u'23:10'], u'2016-03-12': [u'20:00', u'22:10']} 
1
a1 = {u'2016-03-11': [u'20:00', u'22:10']} 
a2 = {u'2016-03-11': [u'20:00', u'23:10'],u'2016-03-12': [u'20:00', u'22:10']} 


an = a1 

for key in a2 : 
    if key in an : 
     an[key] = list(set(a2[key]+ a2[key])) 
     an[key].sort() 
    else : 
     x = {key : a2[key]} 
     an.update(x) 

keyList = an.keys() 
keyList.sort() 
temp = {} 
for key in keyList: 
    temp.update({key:an[key]}) 

an = temp 
print an