2012-06-12 19 views
50

Mam słownika, który wygląda tak:Python Sprawdź, czy lista kluczy istnieje w słowniku

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

oraz listę nazwisk students = ('alex', 'john')

muszę sprawdzić, czy wszystkie nazwy w students istnieć jako klucze w dyktafonie grades.

grades może mieć kilka nazw, ale wszystkie nazwy w students powinny być grades

Musi istnieć bezpośredni sposób to zrobić, ale nadal jestem nowy w Pythonie i nie może zrozumieć. wypróbowany if students in grades, nie działa.

W rzeczywistych przypadkach listy będą znacznie większe.

+0

Możliwy duplikat [Jak mogę sprawdzić, czy wiele kluczy znajduje się w jednym dokumencie w jednym przejściu?] (Https://stackoverflow.com/questions/1285911/how-do-i-check-that-multiple-keys -to-in-a-dict-in-a-pass) –

Odpowiedz

107

Zastosowanie all():

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

@chaft: Przykładowy kod [powinien być poprawny] (http://sscce.org/#co). –

+1

@SvenMarnach: Gdybym mógł głosować na Twój komentarz więcej niż jeden raz, zrobiłbym to. – MattH

+0

Świetnie! Jakikolwiek skrót, aby uzyskać elementy, których brakuje w DIC, jeśli warunek jest fałszywy? – 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 

Nazywając to class jest nieważna, więc zmienił go do names.

+0

To nie może być skrótem, w przeciwieństwie do 'all()'. Zawsze będzie to O (m + n), gdzie m i n to odpowiednie rozmiary "nazw" i "stopni". Użycie 'all()' będzie oznaczało O (m) i może spowodować zwarcie. –

+3

@SvenMarnach Po prostu zostawię to tutaj, ponieważ jest to inne podejście, ale zgadzam się, że twój jest najlepszy. – jamylak

+0

Zdecydowanie zostaw to tutaj! W każdym razie jest to interesujące podejście. –

Powiązane problemy