Proste pytanie: czy istnieje skrót do sprawdzenia istnienia kilku kluczy w słowniku?Pythonic skrót dla kluczy w słowniku?
'foo' in dct and 'bar' in dct and 'baz' in dct
Proste pytanie: czy istnieje skrót do sprawdzenia istnienia kilku kluczy w słowniku?Pythonic skrót dla kluczy w słowniku?
'foo' in dct and 'bar' in dct and 'baz' in dct
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).
all(x in dct for x in ('foo','bar','baz'))
Bardzo ładne. Dzięki! – davidchambers
+1 to seksowne ... – sholsapp
{"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()
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). –
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
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 :) –
Zaakceptowanie tej odpowiedzi dzięki zamieszczeniu przydatnych linków. :) – davidchambers
... chociaż powtarza wcześniejszą odpowiedź @ unutbu. –
@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