Ich habe ein Wörterbuch, das so aussieht:
grades = {
'alex' : 11,
'bob' : 10,
'john' : 14,
'peter': 7
}
und eine Liste von Namen students = ('alex', 'john')
Ich muss überprüfen, ob alle Namen in students
als Schlüssel in grades
dikt existieren.
grades
kann mehr Namen haben, aber alle Namen in students
sollten in seingrades
Es muss einen einfachen Weg geben, aber ich bin noch neu in Python und kann es nicht herausfinden. versucht if students in grades
, hat nicht funktioniert.
In den tatsächlichen Fällen werden die Listen viel größer sein.
Antworten:
Verwendung
all()
:if all(name in grades for name in students): # whatever
quelle
set(students) - grades.keys()
in Python 3.any(k in my_string for k in keys)
?>>> 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
Der Aufruf
class
ist ungültig, daher habe ich ihn geändertnames
.quelle
all()
. Es wird immer O (m + n) sein, wobei m und n die jeweiligen Größen vonnames
und sindgrades
. Die Verwendungall()
ist O (m) und kann eine Abkürzung sein.Angenommen, die Schüler sind festgelegt
if not (students - grades.keys()): print("All keys exist")
Wenn nicht, konvertieren Sie es in set
if not (set(students) - grades.keys()): print("All keys exist")
quelle
Sie können testen, ob sich mehrere Schlüssel in einem Diktat befinden, indem Sie den Vorteil nutzen, dass
<dict>.keys()
a zurückgegeben wirdset
.Diese Logik im Code ...
if 'foo' in d and 'bar' in d and 'baz' in d: do_something()
kann kurz dargestellt werden als:
if {'foo', 'bar', 'baz'} <= d.keys(): do_something()
Der
<=
Operator für Mengen prüft, ob die Menge auf der linken Seite eine Teilmenge der Menge auf der rechten Seite ist. Eine andere Art, dies zu schreiben, wäre<set>.issubset(other)
.Es gibt andere interessante Operationen, die von Sets unterstützt werden: https://docs.python.org/3.8/library/stdtypes.html#set
Mit diesem Trick können viele Stellen im Code komprimiert werden, die nach mehreren Schlüsseln suchen, wie im ersten Beispiel oben gezeigt.
Ganze Schlüssellisten können auch auf Folgendes überprüft werden
<=
: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(): ...
Oder wenn
students
es auch ein Diktat ist:if students.keys() <= grades.keys(): ...
quelle