J'ai un dictionnaire qui ressemble à ça:
grades = {
'alex' : 11,
'bob' : 10,
'john' : 14,
'peter': 7
}
et une liste de noms students = ('alex', 'john')
Je dois vérifier que tous les noms students
existent en tant que clés dans grades
dict.
grades
peut avoir plus de noms, mais tous les noms students
doivent être dansgrades
Il doit y avoir un moyen simple de le faire, mais je suis encore nouveau en python et je ne peux pas le comprendre. essayé if students in grades
, n'a pas fonctionné.
Dans les cas réels, les listes seront beaucoup plus grandes.
Réponses:
Utilisez
all()
:if all(name in grades for name in students): # whatever
la source
set(students) - grades.keys()
en Python 3.any(k in my_string for k in keys)
- être ?>>> 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
L'appeler
class
n'est pas valide, je l'ai donc changé ennames
.la source
all()
. Ce sera toujours O (m + n), où m et n sont les tailles respectives denames
etgrades
. Utiliserall()
sera O (m), et pourrait raccourcir.En supposant que les étudiants sont définis
if not (students - grades.keys()): print("All keys exist")
Sinon, convertissez-le en ensemble
if not (set(students) - grades.keys()): print("All keys exist")
la source
Vous pouvez tester si un certain nombre de clés sont dans un dict en tirant parti de ce qui
<dict>.keys()
renvoie aset
.Cette logique dans le code ...
if 'foo' in d and 'bar' in d and 'baz' in d: do_something()
peut être représenté plus brièvement comme:
if {'foo', 'bar', 'baz'} <= d.keys(): do_something()
L'
<=
opérateur des ensembles teste si l'ensemble de gauche est un sous-ensemble de l'ensemble de droite. Une autre façon d'écrire ce serait<set>.issubset(other)
.Il existe d'autres opérations intéressantes supportées par les ensembles: https://docs.python.org/3.8/library/stdtypes.html#set
L'utilisation de cette astuce peut condenser de nombreux endroits dans le code qui vérifient plusieurs clés, comme indiqué dans le premier exemple ci-dessus.
Des listes entières de clés peuvent également être vérifiées en utilisant
<=
: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(): ...
Ou si
students
c'est aussi un dict:if students.keys() <= grades.keys(): ...
la source