2011-08-13 32 views

Odpowiedz

7

Można użyć all() z generator expression:

>>> all(x in dct for x in ('foo', 'bar', 'qux')) 
False 
>>> all(x in dct for x in ('foo', 'bar', 'baz')) 
True 
>>> 

To oszczędza aż o 2 znaków (ale pozwoli Ci zaoszczędzić dużo więcej, jeśli masz dłuższą listę do sprawdzenia).

+1

Zaakceptowanie tej odpowiedzi dzięki zamieszczeniu przydatnych linków. :) – davidchambers

+0

... chociaż powtarza wcześniejszą odpowiedź @ unutbu. –

+0

@flying sheep: Nie było odpowiedzi, gdy zacząłem pisać. Wydaje mi się, że unutbu rozpoczęło i zakończyło pisanie, a ja stworzyłem pozytywne i negatywne przykłady i dodałem kilka powiązanych odnośników. [to znaczy. Nie kopiowałem jego pracy domowej ;-)] – Johnsyweb

5
{"foo","bar","baz"}.issubset(dct.keys()) 

< dla Pythona 2.7, będziesz musiał wymienić zestaw dosłowne z set(["foo","bar","baz"])

Jeśli lubisz operatorów i nie przeszkadza wydajność tworzenia inny zestaw, można użyć operatora <= na zestaw kluczy zestawu i dyktatora.

Oba warianty połączone wyglądałby następująco:

set(["foo","bar","baz"]) <= set(dct) 

Wreszcie, jeśli używasz Python 3, dict.keys() zwróci obiekt setlike, co oznacza, że ​​można zadzwonić do operatora bez spadku wydajności jak ten:

{"foo","bar","baz"} <= dct.keys() 
+0

To jest zgrabna alternatywa i demonstruje IMHO, że TIMTOWTDI jest nieuniknione; niestety, 'set' w <= 2.6 nie bierze' * args' - musisz jawnie przekazać sekwencję (inny zestaw nawiasów). –

+1

To będzie O (n) zamiast O (1) dla pozostałych. Nie musisz nawet być Holendrem, aby zobaczyć, jak straszne będzie to, jeśli dyktatura jest bardzo duża. – geoffspear

+0

Dziękujemy za błąd w wywołaniu konstruktora i za podanie operatora. Nie sądzę, że O (n) boli w przypadku OP, ponieważ odszedł od ręcznego sprawdzania każdego klucza :) –