Python controlla se l'elenco di chiavi esiste nel dizionario


91

Ho un dizionario che assomiglia a questo:

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

e un elenco di nomi students = ('alex', 'john')

Devo controllare che tutti i nomi in studentsesistano come chiavi in gradesdict.

gradespuò avere più nomi, ma tutti i nomi in studentsdovrebbero essere ingrades

Deve esserci un modo semplice per farlo, ma sono ancora nuovo in Python e non riesco a capirlo. provato if students in grades, non ha funzionato.

Nei casi reali, gli elenchi saranno molto più grandi.


Risposte:


202

Usa all():

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

Grande! Qualche scorciatoia per ottenere gli elementi mancanti dal dic se la condizione è False?
Guival

2
@guival Yup, puoi usare le operazioni sugli insiemi, ad esempio set(students) - grades.keys()in Python 3.
Sven Marnach

c'è un modo per verificare se uno qualsiasi di un elenco di chiavi è una sottostringa in una stringa?
Jonathan

@ Jonathan Non sei sicuro di cosa intendi, forse any(k in my_string for k in keys)?
Sven Marnach

@SvenMarnach ha appena scoperto qualche ()! Questo è esattamente quello che stavo cercando :)
Jonathan

24
>>> 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 non classè valido, quindi l'ho cambiato in names.


Questa non può essere una scorciatoia, in contrasto con all(). Sarà sempre O (m + n), dove m e n sono le rispettive dimensioni di namese grades. L'uso all()sarà O (m) e potrebbe essere una scorciatoia.
Sven Marnach

7
@SvenMarnach Esatto, lo lascio qui poiché è un altro approccio ma sono d'accordo che il tuo è il migliore.
jamylak

Sicuramente lascialo qui! In ogni caso è un approccio interessante.
Sven Marnach

3

Supponendo che gli studenti siano impostati

if not (students - grades.keys()):
    print("All keys exist")

In caso contrario, convertirlo in set

if not (set(students) - grades.keys()):
    print("All keys exist")

0

Puoi verificare se un numero di chiavi è in un dict approfittando che <dict>.keys()restituisce un file set.

Questa logica nel codice ...

if 'foo' in d and 'bar' in d and 'baz' in d:
    do_something()

può essere rappresentato più brevemente come:

if {'foo', 'bar', 'baz'} <= d.keys():
    do_something()

L' <=operatore per gli insiemi verifica se l'insieme a sinistra è un sottoinsieme dell'insieme a destra. Un altro modo per scrivere questo sarebbe <set>.issubset(other).

Ci sono altre operazioni interessanti supportate dai set: https://docs.python.org/3.8/library/stdtypes.html#set

L'utilizzo di questo trucco può condensare molti punti nel codice che verificano la presenza di più chiavi come mostrato nel primo esempio sopra.

È inoltre possibile controllare interi elenchi di chiavi per l'utilizzo di <=:

if set(students) <= grades.keys():
    print("All studends listed have grades in your class.")

# or using unpacking - which is actually faster than using set()
if {*students} <= grades.keys():
    ...

O se studentsè anche un dict:

if students.keys() <= grades.keys():
    ...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.