2016-02-24 38 views
2

這是迄今爲止我試圖查看具有相同密鑰的三個字典並添加其相應值的代碼。如果沒有密鑰存在,我希望代碼添加一個零。在Python中合併相同密鑰的字典

#!/usr/bin/env python 
import sys 
from operator import itemgetter 
import csv 
import ast 
from collections import defaultdict 

super_dic={} 
d1 = {'a':2, 'b':5, 'c':3, 'd':6} 
d2 = {'a':3, 'c':3} 
d3 = {'b':4, 'd':4} 

for d in (d1, d2, d3): 
    for key, value in d.iteritems(): 
    super_dic.setdefault(key, []).append(value) 
print super_dic 

輸出的super_dic建:

{'a': [2, 3], 'c': [3, 3], 'b': [5, 4], 'd': [6, 4]} 

不過,我想我的最終結果是:

{'a':[2, 3, 0], 'c':[3,3,0], 'b':[5,0,4],'d':[6,0,4]} 

值的順序事項

任何幫助/反饋都是muc h讚賞。已經爭取了一段時間,所有嘗試的方法都沒有在最後建立正確的主字典。

*請注意,這不是一個重複的問題,因爲在Python中合併字典時出現的問題都忽略瞭如果密鑰項不存在,則添加。 *

+0

您是否需要將值列表與原始字典的順序相同,或者是否足夠使[5,4,0]而不是[5,0,4]? – Prune

+0

@Prune訂單很重要。我將這個添加到我的問題,所以它明確 – user5927494

+0

@timgeb一個投了+4解決了我的問題!非常感謝。走在前面,並將其標記爲答案 – user5927494

回答

5

爲了更一般化,我們假設您有一個名爲dicts的字典列表。

>>> dicts = [d1, d2, d3] 
>>> allkeys = set(x for d in dicts for x in d.keys())  
>>> super_dic = {k:[d.get(k, 0) for d in dicts] for k in allkeys} 
>>> super_dic 
{'a': [2, 3, 0], 'c': [3, 3, 0], 'b': [5, 0, 4], 'd': [6, 0, 4]} 
+0

非常好的答案。我只想補充一點,在這種情況下,如果d1已經包含所有密鑰,則可以跳過創建'allkeys'集並僅使用d1.keys()代替allkeys: 'super_dic = {k:[d.get (k,0)for d in dicts] for k in d1.keys()}' – JLT

0

我發現了一個有點(尷尬)解決方案:

from collections import defaultdict 

super_dic={} 
d1 = {'a':2, 'b':5, 'c':3, 'd':6} 
d2 = {'a':3, 'c':3} 
d3 = {'b':4, 'd':4} 

# Counter because it might be that there is some element only present in a later dict. 
# And we need to compare the current list lengths in each turn 
i = 0 
for d in (d1, d2, d3): 
    for key in d: 
     # It might be that a key wasn't present before so set default to [0]*i 
     super_dic.setdefault(key, [0]*i).append(d[key]) 
    # Increment i so we can compare the list lengths: 
    i += 1 
    # Append 0 for every key that wasn't appended in this turn: 
    for key in super_dic: 
     if len(super_dic[key]) < i: 
      super_dic[key].append(0) 
print(super_dic) 

{'b': [5, 0, 4], 'a': [2, 3, 0], 'd': [6, 0, 4], 'c': [3, 3, 0]} 

的解釋是內部的代碼註釋我希望這是可以理解的,否則我會進一步闡述他們。只是評論,如果有什麼不清楚。

1

我不喜歡這樣。獲取一組中的所有密鑰,使用列表功能創建一個defaultdict。然後迭代所有字典的所有密鑰。

all_keys = set(d1).union(d2).union(d3) 

merged_dict = defaultdict(list) 
for d in (d1,d2,d3): 
    for key in all_keys: 
     merged_dict[key] += d.get(key, 0), 

print merged_dict 
相關問題