2012-05-31 28 views
5

En los diccionarios que se muestran a continuación, quiero comprobar si la tecla en aa coincide con la clave en bb y también el valor correspondiente coincide en bb o no.Hay una mejor manera de escribir este códigopython dictionary coinciden con los valores clave en dos diccionarios

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

¿Cuál es el resultado deseado? ¿Desea un único valor booleano que indique si las teclas * all * en 'aa' que también aparecen en' bb' tienen valores coincidentes? ¿O un valor booleano por clave? ¿O algún código que imprime '" Key y value bot coincide en aa y bb "' una vez por cada par clave/valor coincidente? –

+1

Hmm ... Pasando por alto el problema con la forma en que iteras sobre 'aa' (pista, eso es lo mismo que' aa.iterkeys() '), tu enfoque básico está realmente bien. ¿Qué es lo que realmente quieres mejorar? – SingleNegationElimination

+1

De alguna manera tengo la impresión de que todos los demás parecen entender lo que Rajeev quiere hacer en primer lugar. Sin embargo, las respuestas a cosas completamente diferentes ... –

Respuesta

15

uso establece para encontrar todos los equivalentes:

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

el operador & aquí se da la intersection of both sets; alternativamente, se podría escribir:

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

Tenga en cuenta que esto no crear copias completas de ambos predice así que si éstos son muy grandes que esto puede no ser el mejor enfoque.

Un acceso directo sería sólo para probar las teclas:

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

Aquí sólo copia las claves de cada dict para reducir el consumo de memoria.

Al utilizar Python 2.7, el tipo dict incluye additional methods para crear los conjuntos requeridos directamente:

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

Estos son técnicamente dictionary views pero para los propósitos de este problema que actúan de la misma.

+0

es '&' igual que 'y' – Rajeev

+2

@Rajeev: ¡No, no lo es! '&' es un operador lógico, que en conjuntos significa 'intersección de'. Actualizó la respuesta para incluir esa información. –

+2

'&' es a nivel de bit AND, no lógico Y. Pero realmente no importa, porque está sobrecargado para los conjuntos. –

5

Esto puede escribirse como una sola línea con all:

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

Es también enfoque más declarativo, lo que podría transmitir la intención mejor.

2

Si desea iterar sobre todos los pares clave/valor a juego, puede utilizar

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

(Python 2.7)

Cuestiones relacionadas