2014-02-28 50 views
2

我有這2個字典;如何處理這兩個字典以獲取Python中的新字典?

Dict1 = {1: ('John', 37), 2: ('Tom', 23), 3: ('Tom', 19), 4: ('Jane', 58)} 
Dict2 = {1: ('2',), 2: ('4',), 3: ('19',)} 

處理上述2個字典的輸出字典是;

OutputDict = {1: ('John', 37), 2: ('Tom', 23)} 

得到OutputDict的邏輯是這樣的;

(1)Dict1Dict2必須具有匹配的鍵。否則,OutputDict將丟棄來自Dict1的鍵值對。 (2)如果找到匹配關鍵字,則值Dict1中的第2個元素必須與Dict2中的值不同。如果它們相同,OutputDict將丟棄來自Dict1的鍵值對。

這怎麼可以在Python中編程?我正在使用Python 2.7。

+0

你嘗試過什麼到目前爲止?您是否在制定解決方案時遇到特定的概念問題? –

+0

我想知道如果我應該使用循環或是否有更多pythonic方法來解決這個問題。 – user781486

+1

@ user3293156在你真正熟悉List/Dict理解之前,總是從for循環開始,然後弄清楚邏輯是否足夠簡單以便進入某種理解。對於更復雜的理解,我仍然會首先寫出for循環,這樣我就可以比較輸出了。 –

回答

3

可以使用dictionary comprehension通過鍵 - 值對中Dict1迭代,僅保留那些鍵 - 值對,使得(1)的鍵在Dict2;和(2)的數值相匹配Dict1Dict2

演示

>>> OutputDict = { k: v for k, v in Dict1.iteritems() 
        if k in Dict2 and int(Dict2[k][0]) != v[1] } 
>>> OutputDict 
{1: ('John', 37), 2: ('Tom', 23)} 
+0

+1:我喜歡這個比另一個dict理解答案更好,主要是因爲問這個問題的人明顯對python更新,這實際上給出了一些解釋,而不僅僅是「答案」 –

+0

感謝您的解釋。我絕對需要它。然而,我從專家的堆棧溢出中獲得答案的驚人速度令人沮喪。這麼快,直到我認爲我不適合做程序員。如何匹配你們?嘆。 – user781486

2

這是你想要的嗎?

Dict1 = {1: ('John', 37), 2: ('Tom', 23), 3: ('Tom', 19), 4: ('Jane', 58)} 
Dict2 = {1: ('2',), 2: ('4',), 3: ('19',)} 
OutputDict = {k: v for (k, v) in Dict1.iteritems() if k in Dict2 and v[1] != int(Dict2[k][0])} 
print OutputDict 

輸出:

{1: ('John', 37), 2: ('Tom', 23)} 
2

使用Zip:

outDict = {i:Dict1[i] for i,j in zip(Dict1.keys(),Dict2.keys()) if i==j and int(Dict1[i][1]) != int(Dict2[i][0])} 

輸出:

{1: ('John', 37), 2: ('Tom', 23)}