2012-05-31 16 views
5

Nei dizionari indicati sotto voglio controllare se la chiave in aa corrisponde alla chiave in bb e anche il valore corrispondente corrisponde a bb o no. C'è un modo migliore per scrivere questo codicedizionario python corrisponde a valori chiave in due dizionari

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

Qual è il risultato desiderato? Vuoi un singolo valore booleano che indichi se * tutti * i tasti in 'aa' che appaiono anche in' bb' abbiano valori corrispondenti? O un valore booleano per chiave? O qualche codice che stampa '' Le corrispondenze dei bot chiave e valore in aa e bb "' una volta per ogni coppia chiave/valore corrispondente? –

+1

Hmm ... Affrontando il problema con il modo in cui si esegue iterazione su 'aa' (suggerimento, equivale a' aa.iterkeys() '), il tuo approccio di base è in realtà giusto. Cosa vuoi veramente migliorare? – SingleNegationElimination

+1

In qualche modo ho l'impressione che tutti gli altri sembrano capire cosa Rajeev vuole fare in primo luogo. Eppure le risposte a cose completamente diverse ... –

risposta

15

utilizzare i set di trovare tutti gli equivalenti:

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

l'operatore & qui si dà la intersection of both sets; in alternativa, si potrebbe scrivere:

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

Si noti che questo non creare copie complete di entrambi i dicts quindi se questi sono molto grandi questo potrebbe non essere l'approccio migliore.

Una scorciatoia sarebbe quello di testare solo le chiavi:

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

Qui si copia solo le chiavi di ogni DICT per ridurre l'impronta di memoria.

Quando si usa Python 2.7, il tipo dict comprende additional methods di creare direttamente i set richiesti:

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

Questi sono tecnicamente dictionary views ma per gli scopi di questo problema che agiscono allo stesso.

+0

è '&' uguale a 'e' – Rajeev

+2

@Rajeev: No non lo è! '&' è un operatore logico, che su insiemi significa 'intersezione di'. Aggiornato la risposta per includere tali informazioni. –

+2

'&' è bit a bit AND, non logico AND. Ma non importa, perché è sovraccarico per i set. –

5

Questo può essere scritta come one-liner con all:

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

E 'anche approccio più dichiarativo, che potrebbe trasmettere l'intento meglio.

2

Se volete iterare su tutte le coppie chiave/valore di corrispondenza, è possibile utilizzare

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

(Python 2.7)

Problemi correlati