2012-06-12 7 views
50

tengo un diccionario que se parece a lo siguiente:cheque Python si existe lista de claves en el diccionario de

grades = { 
     'alex' : 11, 
     'bob' : 10, 
     'john' : 14, 
     'peter': 7 
     } 

y una lista de nombres students = ('alex', 'john')

Tengo que comprobar que todos los nombres en students existen como llaves en grades dict.

grades puede tener varios nombres, pero todos los nombres en students debería estar en grades

Tiene que haber una forma sencilla de hacerlo, pero estoy todavía nuevo en Python y no puede entenderlo. intentado if students in grades, no funcionó.

En los casos reales, las listas serán mucho más grandes.

+0

Posible duplicado de [¿Cómo puedo verificar que múltiples claves estén en un dict en una sola pasada?] (Https://stackoverflow.com/questions/1285911/how-do-i- check-that-multiple-keys -are-in-a-dict-in-a-single-pass) –

Respuesta

107

Uso all():

if all(name in grades for name in students): 
    # whatever 
+25

@chaft: incluso el código de ejemplo [debería ser correcto] (http://sscce.org/#co). –

+1

@SvenMarnach: Si pudiera votar tu comentario más de una vez, lo haría. – MattH

+0

¡Genial! ¿Alguna forma de acceso directo para obtener los elementos que faltan del dic si la condición es False? – guival

17
>>> grades = { 
     'alex' : 11, 
     'bob' : 10, 
     'john' : 14, 
     'peter': 7 
} 
>>> names = ('alex', 'john') 
>>> set(names).issubset(grades) 
True 
>>> names = ('ben', 'tom') 
>>> set(names).issubset(grades) 
False 

Llamándola class no es válido así que lo cambié a names.

+0

Esto no puede atajar, en contraste con 'all()'. Siempre será O (m + n), donde m y n son los tamaños respectivos de 'names' y' grades'. El uso de 'all()' será O (m), y podría cortocircuitarse. –

+3

@SvenMarnach Bien, lo dejaré aquí ya que es otro enfoque, pero estoy de acuerdo en que el suyo es el mejor. – jamylak

+0

Definitivamente déjalo aquí! Es un enfoque interesante en cualquier caso. –

Cuestiones relacionadas