2012-06-12 15 views
50

Ho un dizionario che assomiglia a quello:controllo Python se elenco di chiavi esiste nel dizionario

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

e una lista di nomi students = ('alex', 'john')

ho bisogno di controllare che tutti i nomi in students esistono come chiavi in ​​grades dict.

grades può avere più nomi, ma tutti i nomi students dovrebbero essere in grades

Ci deve essere un modo semplice per farlo, ma io sono ancora nuovo per python e non può capirlo. provato if students in grades, non ha funzionato.

In questi casi, gli elenchi saranno molto più grandi.

+0

Possibile duplicato di [Come verificare che più chiavi siano in un dettato in un unico passaggio?] (Https://stackoverflow.com/questions/1285911/how-do-i-check-that-multiple-keys -are-in-a-dict-in-a-single-pass) –

risposta

107

Uso all():

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

@chaft: codice di esempio anche [dovrebbe essere corretto] (http://sscce.org/#co). –

+1

@SvenMarnach: Se potessi votare il tuo commento più di una volta, lo farei. – MattH

+0

Ottimo! Qualche scorciatoia per ottenere gli elementi mancanti dal dic se la condizione è 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 

Chiamarlo class è valido quindi l'ho cambiato per names.

+0

Questo non può essere una scorciatoia, al contrario di 'all()'. Sarà sempre O (m + n), dove m e n sono le rispettive dimensioni di 'nomi' e' gradi'. Usando 'all()' sarà O (m) e potrebbe essere scorciatoia. –

+3

@SvenMarnach Giusto, lo lascerò qui poiché è un altro approccio ma sono d'accordo che il tuo è il migliore. – jamylak

+0

Sicuramente lascia stare qui! È un approccio interessante in ogni caso. –

Problemi correlati