2012-05-31 8 views
5

W przedstawionych poniżej słownikach chcę sprawdzić, czy klucz w aa odpowiada kluczowi w bb, a także odpowiadająca mu wartość pasuje do bb czy nie. Czy jest tam lepszy sposób zapisu ten kodSłownik Pythona dopasuj wartości kluczy w dwóch słownikach

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

Co jest pożądany rezultat? Czy chcesz mieć jedną wartość typu Boolean wskazującą, czy klucze * all * w 'aa', które pojawiają się również w' bb' mają pasujące wartości? Lub jedna wartość boolowska na klucz? Albo jakiś kod, który wypisuje '' Kluczowe i wartościowe dopasowania bota w aa i bb "' raz dla każdej pasującej pary klucz/wartość? –

+1

Hmm ... Z widokiem na problem ze sposobem, w jaki powtarzasz "aa" (podpowiedź, to jest to samo co "aa.iterkeys()"), twoje podstawowe podejście jest w porządku. Co naprawdę chcesz poprawić? – SingleNegationElimination

+1

Mam wrażenie, że wszyscy inni zdają się rozumieć, co Rajeev chce zrobić w pierwszej kolejności. Jednak odpowiedzi na zupełnie inne rzeczy ... –

Odpowiedz

15

Zastosowanie ustawia się znaleźć wszystkie odpowiedniki:

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

operator & tutaj daje Ci intersection of both sets; alternatywnie można napisać:

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

Zauważ, że to nie tworzenie pełnych kopii obu dicts więc jeśli są bardzo duże ty to może nie być najlepszym rozwiązaniem.

Skrót byłoby tylko przetestować kluczy:

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

Tutaj tylko skopiować klucze każdego dict zmniejszyć zużycie pamięci.

Przy użyciu Python 2.7, typ dict obejmuje additional methods do tworzenia wymaganych zestawów bezpośrednio:

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

Są technicznie dictionary views ale dla celów tego problemu działają one tak samo.

+0

jest "i" równe "i" – Rajeev

+2

@Rajeev: Nie, nie jest! '&' jest operatorem logicznym, który w zestawach oznacza 'przecięcie'. Zaktualizowano odpowiedź, aby uwzględnić te informacje. –

+2

'&' jest bitowe AND, a nie logiczne AND. Ale to naprawdę nie ma znaczenia, ponieważ jest przeciążone dla zestawów. –

5

To może być zapisana jako jedna z wkładką all:

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

Jest również bardziej deklaratywne podejście, które może przekazać intencją lepiej.

2

Jeśli chcesz iteracyjne nad wszystkie pary pasujących klucz/wartość, można użyć

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

(Python 2.7)

Powiązane problemy