2014-03-05 48 views
0

我有2個字典;如何比較2個元組字典來生成這個字典列表?

Dict1={'John': ('AA', 'BB'), 'Tom': ('XX', 'YY'), 'Jane': ('AA', 'BB')} 

Dict2={'John': ('CC', 'DD', '2'), 'Tom': ('CC', 'DD', '1'), 'Jack': ('CC', 'DD', '3')} 

基於這兩個列表,我想生成一個看起來像這樣的字典;

OutputDict={'John': ('AA', 'BB', '2'), 'Tom': ('XX', 'YY', '1')} 

它是如何工作的,

  1. 檢查Dict1和Dict2中的字典是否有匹配的鍵。
  2. 如果它們具有匹配的鍵,則將Dict2中的元組的第3個元素複製並粘貼到Dict1中相應的字典中以生成OutputDict。

這怎麼可以在Python中完成?我正在使用Python2.7。

+3

既然你描述了算法,爲什麼你不向我們展示你嘗試過的Python代碼? – 2014-03-05 10:47:51

回答

2

的直向前溶液是這樣的,類似到其他答案:

outputDict = {} 
for k, v in dict1.items(): 
    if k in dict2: 
     result[k] = v + (dict2[k][2],) 

由於這個問題相當簡單,一個(可以說)更Python的方式可以利用字典理解的,而不兩不誤可讀性:

outputDict = {k: v + (dict2[k][2],) for k, v in dict1.items() if k in dict2} 

我也建議使用LOWER_CASE或駝峯命名變量,按PEP 8 Style Guide,保留UpperCase類的名字。

+0

我喜歡pythonic解決方法問題。這是pythonic的方式,讓我卡住了。 – user781486

2

有多種方式做你正在嘗試做的,一個最簡單的將是如下:

OutputDict = {} 
for key in Dict1.iterkeys(): 
    if key in Dict2: 
     OutputDict[key] = Dict1[key] + Dict2[key][2] 

因爲所有的操作都是O(1),並且可以運行它的每個按鍵Dict1(或Dict2取決於)這一切運行在O(分鐘(N,M)),其中n是Dict1的長度和m Dict2

的長度
+0

如果你不使用它,爲什麼要迭代'value'?也許只是'鍵入Dict1'就行了。另外,你正在加2,而OP想要第二個元素的值。 –

+0

絕對正確:) –

+0

爲了獲得O(min(n,m))的複雜度,你不應該先確定兩個詞典中的哪一個更小嗎?這可能是暗示的,但這樣做只會添加一行代碼(以及其他地方的一些更改),如「d1,d2 = sorted([Dict1,Dict2],key = len)」 – Nuclearman

3
>>> Dict1={'John': ('AA', 'BB'), 'Tom': ('XX', 'YY'), 'Jane': ('AA', 'BB')} 
>>> Dict2={'John': ('CC', 'DD', '2'), 'Tom': ('CC', 'DD', '1'), 'Jack': ('CC', 'DD', '3')} 
>>> OutputDict = {} 
>>> for k in Dict1: 
...  if k in Dict2.keys(): 
...   OutputDict[k] = tuple(Dict1[k]) + tuple(Dict2[k][2]) 
... 
>>> OutputDict 
{'John': ('AA', 'BB', '2'), 'Tom': ('XX', 'YY', '1')}