Chcę zrobić coś takiego:
foo = {'foo':1,'zip':2,'zam':3,'bar':4}
if ("foo","bar") in foo:
#do stuff
Jak sprawdzić, czy zarówno „foo”, jak i „bar” są w dict foo?
python
dictionary
Jean-François Corbett
źródło
źródło
set
to przypadku jest lepszy. Jak zwykle ... zmierzyć to! -)Jeśli nadal korzystasz z Python 2, możesz to zrobić
Jeśli nadal używasz naprawdę starego Pythona <= 2.6, możesz wywołać
set
dyktę, ale będzie on powtarzał się przez cały dykt, aby zbudować zestaw, a to wolno:źródło
set(("foo","bar")) <= myDict.keys()
który unika zestawu tymczasowego, więc jest znacznie szybszy. W moich testach jest to mniej więcej taka sama prędkość, jak w przypadku użycia wszystkich, gdy zapytanie zawierało 10 elementów. Jednak staje się wolniejszy, gdy zapytanie staje się większe.if {'foo', 'bar'} <= set(myDict): ...
Prosty zestaw do testów porównawczych dla 3 alternatyw.
Wprowadź własne wartości dla D i Q
źródło
d.viewkeys()
zrobićset(q) <= d.viewkeys()
.Python 2.7.5
mad.keys()
też metodę.set(q) <= ...
TypeError: can only compare to a set
. Przepraszam! :))d.viewkeys() >= set(q)
. Przybyłem tutaj, aby dowiedzieć się, dlaczego zamówienie ma znaczenie!Nie musisz owijać lewej strony w zestaw. Możesz po prostu to zrobić:
Działa to również lepiej niż
all(k in d...)
rozwiązanie.źródło
Korzystanie z zestawów :
Alternatywnie:
źródło
set(d)
jest taki sam jakset(d.keys())
(bezd.keys()
konstruowanej listy pośredniej )Co powiesz na to:
źródło
all
.Myślę, że jest to najmądrzejszy i pithonic.
źródło
Chociaż podoba mi się odpowiedź Alexa Martellego, nie wydaje mi się ona pytoniczna. To znaczy, myślałem, że ważną częścią bycia Pythonem jest łatwość zrozumienia. W tym celu
<=
nie jest łatwo zrozumieć.Chociaż jest więcej postaci, używanie
issubset()
zgodnie z sugestią Karla Voigtlanda jest bardziej zrozumiałe. Ponieważ ta metoda może wykorzystywać słownik jako argument, krótkie, zrozumiałe rozwiązanie to:Chciałbym użyć
{'foo', 'bar'}
zamiastset(('foo', 'bar'))
, ponieważ jest krótszy. Nie jest to jednak tak zrozumiałe i myślę, że nawiasy klamrowe są zbyt łatwo mylone jako słownik.źródło
.issubset()
. Myślę, że obecność w dokumentacji Pythona domyślnie sprawia, że jest to język Python.Rozwiązanie Alexa Martellego
set(queries) <= set(my_dict)
jest najkrótszym kodem, ale może nie być najszybszym. Załóżmy, że Q = len (zapytania) i D = len (mój_dykt).To zajmuje O (Q) + O (D), aby utworzyć dwa zestawy, a następnie (jeden ma nadzieję!) Tylko O (min (Q, D)), aby wykonać test podzestawu - zakładając oczywiście, że wyszukiwanie zestawu Python to O (1) - jest to najgorszy przypadek (gdy odpowiedź brzmi Prawda).
Generatorowym rozwiązaniem hughdbrown (i in.?)
all(k in my_dict for k in queries)
Jest najgorszy przypadek O (Q).Czynniki komplikujące:
(1) wszystkie pętle w gadżecie opartym na zestawie są wykonywane z prędkością C, podczas gdy gadżet oparty na dowolnym zestawie zapętla się po kodzie bajtowym.
(2) Osoba wywołująca dowolny gadżet może być w stanie wykorzystać dowolną wiedzę o prawdopodobieństwie niezamawiania odpowiednio elementów zapytania, natomiast gadżet oparty na zestawie nie pozwala na taką kontrolę.
Jak zawsze, jeśli prędkość jest ważna, dobrym pomysłem jest przeprowadzenie testów porównawczych w warunkach operacyjnych.
źródło
Można użyć .issubset () , jak również
źródło
A może skorzystasz z lambda?
źródło
Jeśli chcesz:
następnie:
źródło
Nie sugerując, że nie jest to coś, o czym nie pomyślałeś, ale uważam, że najprostsza rzecz jest zwykle najlepsza:
źródło
Jason, () nie są potrzebne w Pythonie.
źródło
Po prostu moje zdanie na ten temat, istnieją dwie metody, które są łatwe do zrozumienia dla wszystkich podanych opcji. Więc moje główne kryteria to bardzo czytelny kod, a nie wyjątkowo szybki kod. Aby kod był zrozumiały, wolę dawać możliwości:
Fakt, że „var <= var2.keys ()” działa szybciej w moich testach poniżej, wolę ten.
źródło
W przypadku ustalenia, czy tylko niektóre klucze pasują, działa to:
Jeszcze jedna opcja, aby sprawdzić, czy pasują tylko niektóre klucze:
źródło
Inna opcja wykrywania, czy wszystkie klucze są w nagraniu:
źródło
To wydaje się działać
źródło
()
że zostanie najpierw oceniony i wynikTrue
, który następnie sprawdzi, czyTrue in ok
. Jak to właściwie działa ?!