Natknąłem się na to:
item = someSortOfSelection()
if item in myList:
doMySpecialFunction(item)
ale czasami to nie działa ze wszystkimi moimi elementami, tak jakby nie zostały rozpoznane na liście (gdy jest to lista ciągów znaków).
Czy jest to najbardziej „pytonowy” sposób znajdowania pozycji na liście if x in l:
:?
myList
.Odpowiedzi:
Jeśli chodzi o twoje pierwsze pytanie: ten kod jest całkowicie w porządku i powinien działać, jeśli
item
równa się jednemu z elementów w środkumyList
. Być może próbujesz znaleźć ciąg, który nie pasuje dokładnie do jednego z elementów, lub może używasz wartości zmiennoprzecinkowej, która cierpi z powodu niedokładności.Jeśli chodzi o twoje drugie pytanie: istnieje kilka możliwych sposobów „znalezienia” rzeczy na listach.
Sprawdzanie, czy coś jest w środku
Oto opisany przypadek użycia: Sprawdzanie, czy coś znajduje się na liście, czy nie. Jak wiesz, możesz do tego użyć
in
operatora:Filtrowanie kolekcji
Znalezienie wszystkich elementów w sekwencji, które spełniają określony warunek. W tym celu możesz użyć rozumienia listy lub wyrażeń generatora:
Ten ostatni zwróci generator, który możesz sobie wyobrazić jako rodzaj leniwej listy, która zostanie zbudowana, gdy tylko ją przejdziesz. Nawiasem mówiąc, pierwszy jest dokładnie równoważny z
w Python 2. Tutaj możesz zobaczyć funkcje wyższego rzędu w pracy. W Pythonie 3
filter
nie zwraca listy, ale obiekt podobny do generatora.Znalezienie pierwszego wystąpienia
Jeśli chcesz tylko pierwszą rzecz, która pasuje do warunku (ale jeszcze nie wiesz, co to jest), dobrze jest użyć pętli for (być może również użyć
else
klauzuli, która nie jest tak naprawdę dobrze znana). Możesz także użyćktóry zwróci pierwszy mecz lub podbije,
StopIteration
jeśli nie zostanie znaleziony. Alternatywnie możesz użyćZnalezienie położenia przedmiotu
W przypadku list istnieje również
index
metoda, która może być czasem przydatna, jeśli chcesz wiedzieć, gdzie jest określony element na liście:Pamiętaj jednak, że jeśli masz duplikaty,
.index
zawsze zwraca najniższy indeks: ......Jeśli są duplikaty i chcesz mieć wszystkie indeksy, możesz
enumerate()
zamiast tego użyć :źródło
if x in list
to nie rzecz, że ludzie skarżą się, nie będąc wbudowana funkcja. Skarżą się na fakt, że nie ma jednoznacznego sposobu znalezienia pierwszego wystąpienia czegoś na liście, które pasuje do określonego warunku. Ale jak stwierdzono w mojej odpowiedzi,next()
można (ab) do tego wykorzystać.[list comprehension...][0]
podejścieindex()
takkey
, jakkey
zaakceptowałmax()
; na przykład:index(list, key=is_prime)
.Jeśli chcesz znaleźć jeden element lub
None
użyć domyślnego wnext
, nie podniesie się,StopIteration
jeśli element nie został znaleziony na liście:źródło
next
przyjmuje iterator jako pierwszy parametr, a lista / krotka NIE jest iteratorem. Tak powinno byćfirst_or_default = next(iter([x for x in lst if ...]), None)
zobacz docs.python.org/3/library/functions.html#next(x for x in lst if ...)
jest generatorem nad listąlst
(który jest iteratorem). Jeśli to zrobisznext(iter([x for x in lst if ...]), None)
, musisz zbudować listę[x for x in lst if ...]
, co będzie znacznie droższą operacją.if
w lambda i możesz pisaćfind(fn,list)
zwykle zamiast zaciemniać kod generatora.Chociaż odpowiedź od Niklasa B. jest dość wyczerpująca, kiedy chcemy znaleźć pozycję na liście, czasem przydatne jest uzyskanie jej indeksu:
źródło
Znalezienie pierwszego wystąpienia
Jest na to przepis w
itertools
:Na przykład poniższy kod znajduje pierwszą liczbę nieparzystą na liście:
źródło
Inna alternatywa: możesz sprawdzić, czy pozycja znajduje się na liście
if item in list:
, ale jest to kolejność O (n). Jeśli masz do czynienia z dużymi listami przedmiotów i wszystko, co musisz wiedzieć, to czy coś jest członkiem listy, możesz najpierw przekonwertować listę na zestaw i skorzystać z ciągłego wyszukiwania zestawu czasu :Nie zawsze będzie to właściwe rozwiązanie, ale w niektórych przypadkach może to dać lepszą wydajność.
Zauważ, że utworzenie zestawu za pomocą
set(my_list)
to także O (n), więc jeśli musisz to zrobić tylko raz, nie jest to szybsze. Jeśli jednak trzeba wielokrotnie sprawdzać członkostwo, będzie to O (1) dla każdego wyszukiwania po utworzeniu zestawu początkowego.źródło
Podczas pracy z listą ciągów możesz użyć jednego z dwóch możliwych wyszukiwań:
jeśli element listy jest równy elementowi („przykład” znajduje się w [„jeden”, „przykład”, „dwa”]):
if item in your_list: some_function_on_true()
„ex” w [„one”, „ex”, „two”] => True
„ex_1” w [„one”, „ex”, „two”] => False
jeśli element listy jest jak element („ex” znajduje się w [„one,” example ”,„ two ”] lub„ example_1 ”znajduje się w [„ one ”,„ example ”,„ two ”]:
matches = [el for el in your_list if item in el]
lub
matches = [el for el in your_list if el in item]
w
len(matches)
razie potrzeby po prostu je sprawdź lub przeczytaj.źródło
Definicja i zastosowanie
count()
sposób powraca liczbę elementów o określonej wartości.Składnia
przykład:
Przykład pytania:
źródło
Zamiast używać,
list.index(x)
który zwraca indeks x, jeśli zostanie znaleziony na liście lub zwraca#ValueError
komunikat, jeśli x nie zostanie znaleziony, możesz użyć,list.count(x)
który zwraca liczbę wystąpień x na liście (sprawdzanie, czy x rzeczywiście znajduje się na liście) lub zwraca 0 w przeciwnym razie (przy braku x). Fajną rzeczącount()
jest to, że nie psuje kodu ani nie wymaga wyjątku, gdy x nie zostanie znalezioneźródło
Jeśli masz zamiar sprawdzić, czy wartość istnieje w kolekcji, to użycie operatora „w” jest w porządku. Jeśli jednak masz zamiar sprawdzić więcej niż jeden raz, zalecamy użycie modułu bisect. Należy pamiętać, że przy użyciu danych modułu dwusiecznego należy posortować. Więc sortujesz dane raz, a potem możesz użyć dwusiecznej. Korzystanie z modułu dwusiecznego na mojej maszynie jest około 12 razy szybsze niż użycie operatora „w”.
Oto przykład kodu używającego składni Python 3.8 i nowszej:
Wynik:
źródło
Sprawdź, czy w elementach listy ciągów nie ma dodatkowych / niechcianych białych znaków. To jest powód, który może przeszkadzać, wyjaśniając, że nie można znaleźć przedmiotów.
źródło