Próbuję znaleźć krótki sposób, aby sprawdzić, czy którykolwiek z poniższych elementów znajduje się na liście, ale moja pierwsza próba nie działa. Oprócz napisania funkcji do osiągnięcia tego celu, jest to jakikolwiek krótki sposób sprawdzenia, czy jeden z wielu elementów znajduje się na liście.
>>> a = [2,3,4]
>>> print (1 or 2) in a
False
>>> print (2 or 1) in a
True
a = [1, 2] b = [3, 5, 2, 6, 8, 9] c = [3, 5, 6, 8, 1, 9] print( (1 and 2) in b ,(2 and 1) in b ,(1 and 2) in c ,(2 and 1) in c, sep='\n')
jest prawdą Fałsz Fałsz prawdaOdpowiedzi:
Zarówno puste listy, jak i puste zestawy są fałszywe, więc możesz użyć wartości bezpośrednio jako wartości prawdy.
źródło
any
może wrócić wcześniej, jak tylko znajdzieTrue
wartość - nie musi najpierw budować całej listyAch, Tobiaszu, pobiłeś mnie do tego. Myślałem o tej niewielkiej odmianie twojego rozwiązania:
źródło
x in long for x in short
vsx in short for x in long
)a
ib
mają taką samą długość, max i min powróci lewej najwięcej listę, co sprawia, żeany()
połączenia działają na tej samej liście po obu stronach. Jeśli koniecznie wymagają sprawdzania długości, odwrócić kolejność na listach w drugim naborze:any(x in max(a, b, key=len) for x in (b, a, key=len))
.any(x in max(a, b, key=len) for x in min(b, a, key=len))
(spóźniłeś się na minutę).Może trochę bardziej leniwy:
źródło
any
może wrócić wcześniej, podczas gdy twoja wersja musi zbudować całą listę ze zrozumienia, zanim będzieany
mogła z niej korzystać. Odpowiedź użytkownika @8989788 jest nieco lepsza, ponieważ podwójne nawiasy są niepotrzebneZastanów się, co tak naprawdę mówi kod!
To prawdopodobnie powinno to wyjaśniać. :) Python najwyraźniej implementuje „leniwe” lub „leniwe”, co nie powinno dziwić. Wykonuje to coś takiego:
W pierwszym przykładzie
x == 1
iy == 2
. W drugim przykładzie jest odwrotnie. Dlatego zwraca różne wartości w zależności od ich kolejności.źródło
Kodowa wersja golfa. Rozważ użycie zestawu, jeśli ma to sens. Uważam to za bardziej czytelne niż zrozumienie listy.
źródło
1 linia bez objaśnień listy.
źródło
Najlepsze, co mogłem wymyślić:
źródło
W Pythonie 3 możemy zacząć korzystać z gwiazdki rozpakowania. Biorąc pod uwagę dwie listy:
Edycja: uwzględnij sugestię alkanenu
źródło
Kiedy myślisz „sprawdź, czy a in b”, pomyśl o hashach (w tym przypadku ustawia). Najszybszym sposobem jest haszowanie listy, którą chcesz sprawdzić, a następnie sprawdzenie każdej pozycji na liście.
Dlatego odpowiedź Joe Koberga jest szybka: sprawdzanie przecięcia zestawu jest bardzo szybkie.
Kiedy nie masz dużo danych, tworzenie zestawów może być stratą czasu. Możesz więc utworzyć zestaw listy i po prostu sprawdzić każdy element:
Gdy liczba elementów, które chcesz sprawdzić, jest niewielka, różnica może być nieznaczna. Ale sprawdź wiele liczb na dużej liście ...
testy:
prędkości:
Metodą, która jest konsekwentnie szybka, jest utworzenie jednego zestawu (z listy), ale przecięcie działa najlepiej na dużych zestawach danych!
źródło
W niektórych przypadkach (np. Unikalne elementy listy) można użyć operacji ustawiania.
Lub używając set.isdisjoint () ,
źródło
To zrobi to w jednej linii.
źródło
Zebrałem kilka rozwiązań wymienionych w innych odpowiedziach i komentarzach, a następnie przeprowadziłem test prędkości.
not set(a).isdisjoint(b)
okazał się najszybszy, nie spowolnił też zbytnio, gdy wynik byłFalse
.Każdy z trzech przebiegów testuje małą próbkę możliwych konfiguracji
a
ib
. Czasy są w mikrosekundach.źródło
Muszę powiedzieć, że moja sytuacja może nie być tym, czego szukasz, ale może stanowić alternatywę dla twojego myślenia.
Próbowałem zarówno metody set (), jak i dowolnej (), ale nadal mam problemy z prędkością. Przypomniałem sobie, że Raymond Hettinger powiedział, że wszystko w pythonie jest słownikiem i używaj dict, kiedy tylko możesz. Więc tego próbowałem.
Użyłem defaultdict z int, aby wskazać negatywne wyniki i użyłem elementu z pierwszej listy jako klucza do drugiej listy (przekonwertowanej na defaultdict). Ponieważ masz natychmiastowe wyszukiwanie za pomocą dict, od razu wiesz, czy ten element istnieje w defaultdict. Wiem, że nie zawsze zmieniasz strukturę danych na drugiej liście, ale jeśli możesz to zrobić od samego początku, jest to o wiele szybsze. Może być konieczne przekonwertowanie list2 (większej listy) na defaultdict, gdzie kluczem jest potencjalna wartość, którą chcesz sprawdzić z małej listy, a wartość to 1 (trafienie) lub 0 (brak trafienia, domyślnie).
źródło
Prosty.
źródło
a
znajduje się na liścieb
.