2012-05-31 171 views
5

在下面顯示的字典中,我想檢查aa中的鍵是否與bb中的鍵匹配,並且與bb中的鍵相對應的值是否與bb匹配。是否有更好的寫法這個代碼python詞典匹配兩個字典中的鍵值

aa = {'a': 1, 'c': 3, 'b': 2} 
    bb = {'a': 1, 'b': 2} 

    for k in aa: 
    if k in bb: 
     if aa[k] == bb[k]: 
     print "Key and value bot matches in aa and bb" 
+0

什麼是你想要的結果?你是否想要一個布爾值來指示'aa'中的* all *鍵是否也出現在'bb'中具有匹配值?或每個鍵一個布爾值?或者爲每個匹配的鍵/值對打印一次「aa和bb中的鍵和值匹配」的代碼? –

+1

嗯......通過遍歷'aa'(提示,與'aa.iterkeys()')相同的方式來看問題,你的基本方法其實很好。你究竟想要改進什麼? – SingleNegationElimination

+1

我總覺得其他人似乎都明白Rajeev最初想做什麼。然而,對完全不同的東西的答案... –

回答

15

使用了一組找到所有的等同物:

for (key, value) in set(aa.items()) & set(bb.items()): 
    print '%s: %s is present in both aa and bb' % (key, value) 

這裏的&運營商爲您提供了intersection of both sets;或者你可以寫:

set(aa.items()).intersection(set(bb.items())) 

請注意,這並創建這兩個類型的字典的完整副本,所以如果這是非常大的,你這未必是最好的辦法。

的快捷方式是隻測試鍵:

for key in set(aa) & set(bb): 
    if aa[key] == bb[key]: 
     print '%s: %s is present in both aa and bb' % (key, value) 

在這裏,你只有每個快譯通,以減少內存佔用複製的鑰匙。

當使用Python 2.7,該字典類型包括additional methods直接創建所需的組:

for (key, value) in aa.viewitems() & bb.viewitems(): 
    print '%s: %s is present in both aa and bb' % (key, value) 

這些都是技術上dictionary views但對於這個問題的目的,他們的行爲是相同的。

+0

是'&'等於'和' – Rajeev

+2

@Rajeev:不,它不是! '&'是一個邏輯運算符,它在集合上表示「交集」。更新了包含該信息的答案。 –

+2

'&'是按位AND,而不是邏輯AND。但它並不重要,因爲它已經過載了。 –

5

這可以寫成一內膽採用all

all(bb[k] == v for k, v in aa.iteritems() if k in bb) 

它也更聲明的方式,這可能會傳達的意圖更好。

2

如果你想遍歷所有匹配的鍵/值對,您可以使用

for key, value in aa.viewitems() & bb.viewitems(): 
    ... 

(Python 2.7版)