2013-10-08 86 views
-3
dict1 = {a:10, b:15, c:20} 
dict2 = {a:25, b:30, c:35} 

想輸出什麼,我要的是:合併兩本詞典有兩個單獨的值

dict3 = {a : (10, 25), b : (15, 30), c : (20, 35)} 

下面有什麼,我有一個樣品

dict1 = {'192.168.1.21':23,'127.0.0.1':5,'12.12.12.12':5,'55.55.55.55':10} 
dict2 = {'192.168.1.21':27,'10.10.0.1':7,'127.0.0.1':1} 
dict3 = {} 

for dictionary in (dict1,dict2): 
    for k,v in dictionary.iteritems(): 
    dict3[k] = dict3.get(k, 0) + v 

誰能幫我這個

+1

我敢肯定,很多人會很高興能幫助你,當你展示你迄今爲止所嘗試過的。 –

+0

這可以很容易地完成,但我質疑爲什麼它需要完成。如果鍵是相同的,那麼這兩個字典必須是從同一個源生成的,爲什麼不同時生成'dict3'而不是稍後加入? – nmclean

+0

你原來的例子並不是很好的簡化你的真實情況。你想要什麼'dict3 [「10.10.0.1」]'? '(7,)'或'(None,7,)'或別的東西:也許'(0,7,)'? – DSM

回答

0

相反,嘗試寫作:

for k in set(dict1.keys())|set(dict2.keys()): 
    dict3[k] = (dict1.get(k,0),dict2.get(k,0)) 

這會從兩個字典所有鍵和返回其值的元組,就像你想要的。如果某個列表中不存在該鍵,它將返回零,但您可以將其更改爲任何您可能需要的值。

所以對:

dict1 = {'192.168.1.21':23,'127.0.0.1':5,'12.12.12.12':5,'55.55.55.55':10} 
dict2 = {'192.168.1.21':27,'10.10.0.1':7,'127.0.0.1':1} 

它將返回:

dict3 = {'55.55.55.55': (10, 0), '10.10.0.1': (0, 7), '12.12.12.12': (5, 0), 
     '127.0.0.1': (5, 1), '192.168.1.21': (23, 27)} 
+0

非常感謝您的幫助,這完美運作。學習python 2周後,我非常喜歡它。 – Msquared

1

我可能會這樣做:

>>> dict1 = {'192.168.1.21':23,'127.0.0.1':5,'12.12.12.12':5,'55.55.55.55':10} 
>>> dict2 = {'192.168.1.21':27,'10.10.0.1':7,'127.0.0.1':1} 
>>> ds = dict1, dict2 
>>> {k: tuple(d.get(k, 0) for d in ds) for k in set().union(*ds)} 
{'55.55.55.55': (10, 0), '10.10.0.1': (0, 7), '12.12.12.12': (5, 0), 
'127.0.0.1': (5, 1), '192.168.1.21': (23, 27)} 

這使用了一些技巧。 set().union(*ds)得到所有鍵的工會在字典:

>>> set().union(*ds) 
set(['55.55.55.55', '10.10.0.1', '12.12.12.12', '192.168.1.21', '127.0.0.1']) 

(。帽尖到@JonClements我曾經寫set.union(*(map(set, ds))),我從來不喜歡的set重複)

tuple(d.get(k, 0) for d in ds)品牌來自0的元組或與每個字典中的密鑰k相關聯的值。

而整個事情被包裝在字典理解中,所以我們不需要任何其他循環。

0
for dictionary in (dict1,dict2): 
    for k,v in dictionary.iteritems(): 
    dict3[k] = dict3.get(k, 0) + v 

在這裏,您是從0增加值,導致單個值。你想要一個元組,所以這種方法工作,你需要從一個空的元組啓動並添加新值的單項元組:

dict3[k] = dict3.get(k,()) + (v,) 

我不喜歡這種做法是你正在遍歷這兩個字典的所有項目,完全擊敗了使用字典的目的(通過鍵快速查找特定項目)。如果dict1至少都在dict2的鑰匙,我這樣做:

dict3 = dict((key, (value1, dict2.get(key, 0))) for key, value1 in dict1.iteritems()) 

這將結合所有匹配的密鑰和用於dict1每個關鍵並不在dict2存在插入0。但是,如果dict2也具有dict1不具備的密鑰,確保獲得所有這些密鑰的唯一方法是迭代這兩個字典。當然,您可能只關心dict1的密鑰(即,您不需要查看沒有匹配源IP的目標IP),在這種情況下,這正是您想要的。

+0

感謝這也回答了我的另一個問題。這也有助於我提高效率 – Msquared

0
#You can use has_key() dictionary built in function# 

for k,v in dict1.items() 
     if dict2.has_key(k): 
       dict3[k]=(v,dict2[k])