2014-09-29 32 views
0

我有兩個字典:合併兩個詞典與爲了節省

a = {u'Anthracite': [u'3/optimized/8593793_fpx.tif'], 
u'Black': [u'6/optimized/8593796_fpx.tif'], 
u'Cobalt': [u'9/optimized/8593799_fpx.tif'], 
u'Fire': [u'2/optimized/8593802_fpx.tif'], 
u'Fuschia': [u'5/optimized/8593805_fpx.tif'], 
u'Iris': [u'8/optimized/8593808_fpx.tif'], 
u'Midnight': [u'1/optimized/8593811_fpx.tif']} 

b = {u'Anthracite': [u'5/optimized/8593795_fpx.tif'], 
u'Black': [u'8/optimized/8593798_fpx.tif'], 
u'Cobalt': [u'1/optimized/8593801_fpx.tif'], 
u'Fire': [u'4/optimized/8593804_fpx.tif'], 
u'Fuschia': [u'7/optimized/8593807_fpx.tif'], 
u'Iris': [u'0/optimized/8593810_fpx.tif'], 
u'Midnight': [u'3/optimized/8593813_fpx.tif']} 

我需要產生這樣的字典:

c = {u'Anthracite': [u'3/optimized/8593793_fpx.tif', u'5/optimized/8593795_fpx.tif'], 
u'Black': [u'6/optimized/8593796_fpx.tif', u'8/optimized/8593798_fpx.tif'], 
.... 
} 

所以我需要從相同的密鑰列表中收集的所有項目,但我需要保存第一順序。

字典總是有相同的密鑰

我已經嘗試用拉鍊做到這一點,但我真的變得一團糟

+0

你如何打算這樣做?你有沒有爲此編寫代碼?字典是否總是有相同的密鑰? – filmor 2014-09-29 09:05:42

+0

@filmor我有更新的問題,是的鍵總是相同的 – user3919096 2014-09-29 09:10:26

+0

請顯示您的代碼。 – filmor 2014-09-29 09:11:55

回答

0

爲什麼不只是遍歷字典並複製到一個新的字典?一個defaultdict在下面的代碼用於簡單:

from collections import defaultdict 
c = defaultdict(list) 
a = {"foo": ["bar"]} 
b = {"foo": ["baz"], "bah": ["foo"]} 
for k, v in a.items() + b.items(): 
    c[k].extend(v) 

如果密鑰是相同的,可以複製的第一個字典,並更新其內容:

d = a.copy() 

for k, v in b.iteritems(): 
    d[k].extend(v) 

注意,後者創建了一個淺複製,因此字典a也被修改過程中。

0

如果你想按字母順序排列,使用OrderedDictsort鍵:

from collections import OrderedDict 
srt_keys = sorted(a.keys()) 

d = OrderedDict() 
for k in srt_keys: 
    d[k] = a[k] 
    d[k] += b[k] 
print d 

OrderedDict([(u'Anthracite', [u'3/optimized/8593793_fpx.tif', u'5/optimized/8593795_fpx.tif']), (u'Black', [u'6/optimized/8593796_fpx.tif', u'8/optimized/8593798_fpx.tif']), (u'Cobalt', [u'9/optimized/8593799_fpx.tif', u'1/optimized/8593801_fpx.tif']), (u'Fire', [u'2/optimized/8593802_fpx.tif', u'4/optimized/8593804_fpx.tif']), (u'Fuschia', [u'5/optimized/8593805_fpx.tif', u'7/optimized/8593807_fpx.tif']), (u'Iris', [u'8/optimized/8593808_fpx.tif', u'0/optimized/8593810_fpx.tif']), (u'Midnight', [u'1/optimized/8593811_fpx.tif', u'3/optimized/8593813_fpx.tif'])]) 
0

如何使用OrderedDict有一個元組列表設置初始訂單。然後簡單地維護它。

這裏查看我的回答對更好的字典語法:Override the {...} notation so i get an OrderedDict() instead of a dict()?

from collections import OrderedDict 

#Use an ordered dict, with a tuple list init to maintain initial order 
a = OrderedDict([ 
     (u'Anthracite', [u'3/optimized/8593793_fpx.tif']), 
     (u'Black', [u'6/optimized/8593796_fpx.tif']), 
     (u'Cobalt', [u'9/optimized/8593799_fpx.tif']), 
     (u'Fire', [u'2/optimized/8593802_fpx.tif']), 
     (u'Fuschia', [u'5/optimized/8593805_fpx.tif']), 
     (u'Iris', [u'8/optimized/8593808_fpx.tif']), 
     (u'Midnight', [u'1/optimized/8593811_fpx.tif']) 
     ]) 

#We don't care about b's order 
b = {u'Anthracite': [u'5/optimized/8593795_fpx.tif'], 
u'Black': [u'8/optimized/8593798_fpx.tif'], 
u'Cobalt': [u'1/optimized/8593801_fpx.tif'], 
u'Fire': [u'4/optimized/8593804_fpx.tif'], 
u'Fuschia': [u'7/optimized/8593807_fpx.tif'], 
u'Iris': [u'0/optimized/8593810_fpx.tif'], 
u'Midnight': [u'3/optimized/8593813_fpx.tif']} 

merge = OrderedDict() 
#Since b has the same keys as a(we don't need to care for diffrent keys), but we want a's order 
for key in a: 
    #We insert by order to an OrderedDict so the same order will be maintained 
    merge[key] = a[key] + b[key] 
+0

除了事實上輸出與OP的預期不符之外,這與我的回答發佈之前的幾小時有何不同? – 2014-09-29 13:03:38