Natknąłem się na to:
item = someSortOfSelection()
if item in myList:
doMySpecialFunction(item)
ale czasami nie działa to z wszystkimi moimi elementami, tak jakby nie były'rozpoznawane na liście (kiedy jest to'lista łańcuchów).
Czy to jest najbardziej 'pythonic' sposób na znalezienie elementu na liście: if x in l:
?
Co do Twojego pierwszego pytania: ten kod jest całkowicie w porządku i powinien działać, jeśli item
jest równy jednemu z elementów wewnątrz myList
. Być może próbujesz znaleźć ciąg znaków, który nie dokładnie pasuje do jednego z elementów lub może używasz wartości float, która cierpi na niedokładność.
Jeśli chodzi o twoje drugie pytanie: There's actually several possible ways if "finding" things in lists.
To jest przypadek użycia, który opisujesz: Sprawdzanie, czy coś znajduje się wewnątrz listy, czy nie. Jak wiesz, możesz użyć do tego operatora in
:
3 in [1, 2, 3] # => True
Czyli znalezienie wszystkich elementów w sekwencji, które spełniają pewien warunek. Można do tego użyć wyrażeń typu list comprehension lub generator:
matches = [x for x in lst if fulfills_some_condition(x)]
matches = (x for x in lst if x > 6)
To ostatnie zwróci generator, który możesz sobie wyobrazić jako rodzaj leniwej listy, która będzie budowana tylko wtedy, gdy będziesz przez nią iterował. Przy okazji, pierwszy z nich jest dokładnie równoważny
matches = filter(fulfills_some_condition, lst)
w Pythonie 2. Tutaj możesz zobaczyć funkcje wyższego rzędu w pracy. W Pythonie 3, filter
nie zwraca listy, ale obiekt podobny do generatora.
Jeśli chcesz tylko pierwszą rzecz, która spełnia warunek (ale jeszcze nie wiesz, co to jest), dobrze jest użyć pętli for (być może używając również klauzuli else
, która nie jest dobrze znana). Możesz również użyć
next(x for x in lst if ...)
która zwróci pierwsze dopasowanie lub podniesie StopIteration
jeśli żadne nie zostanie znalezione. Alternatywnie, możesz użyć
next((x for x in lst if ...), [default value])
Dla list, istnieje również metoda index
, która może być przydatna, jeśli chcesz wiedzieć, gdzie* dany element znajduje się na liście:
[1,2,3].index(2) # => 1
[1,2,3].index(4) # => ValueError
Zauważ jednak, że jeśli masz duplikaty, .index
zawsze zwraca najniższy indeks:......
[1,2,3,2].index(2) # => 1
Jeśli są duplikaty i chcesz mieć wszystkie indeksy, możesz użyć enumerate()
zamiast tego:
[i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3]