Mam słownik, który wygląda tak:
grades = {
'alex' : 11,
'bob' : 10,
'john' : 14,
'peter': 7
}
i listę nazwisk students = ('alex', 'john')
Muszę sprawdzić, czy wszystkie nazwy są w students
dyktandzie jako klucze grades
.
grades
może mieć więcej nazw, ale wszystkie nazwy w sekcji students
powinny znajdować się wgrades
Musi istnieć prosty sposób, aby to zrobić, ale wciąż jestem nowy w Pythonie i nie mogę tego rozgryźć. próbował if students in grades
, nie działa.
W rzeczywistości listy będą znacznie większe.
Odpowiedzi:
Zastosowanie
all()
:if all(name in grades for name in students): # whatever
źródło
set(students) - grades.keys()
w Pythonie 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
Nazywanie go
class
jest nieprawidłowe, więc zmieniłem go nanames
.źródło
all()
. Zawsze będzie to O (m + n), gdzie m i n są odpowiednimi rozmiaraminames
igrades
. Użycieall()
będzie O (m) i może być skrótem.Zakładając, że studenci są zbiorem
if not (students - grades.keys()): print("All keys exist")
Jeśli nie, przekonwertuj go na zestaw
if not (set(students) - grades.keys()): print("All keys exist")
źródło
Możesz sprawdzić, czy w dyktandzie znajduje się kilka kluczy, korzystając z funkcji, która
<dict>.keys()
zwraca plikset
.Ta logika w kodzie ...
if 'foo' in d and 'bar' in d and 'baz' in d: do_something()
można przedstawić krócej jako:
if {'foo', 'bar', 'baz'} <= d.keys(): do_something()
<=
Operator do testów zestawów do zestawu czy po lewej stronie jest podzbiorem zbioru po prawej stronie. Inaczej można by to napisać<set>.issubset(other)
.Istnieją inne interesujące operacje obsługiwane przez zestawy: https://docs.python.org/3.8/library/stdtypes.html#set
Użycie tej sztuczki może skondensować wiele miejsc w kodzie, które sprawdzają kilka kluczy, jak pokazano w pierwszym przykładzie powyżej.
Można również sprawdzić całe listy kluczy pod kątem użycia
<=
: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(): ...
Lub jeśli
students
jest to również dykt:if students.keys() <= grades.keys(): ...
źródło