Mam kod, który wygląda mniej więcej tak:
thing_index = thing_list.index(thing)
otherfunction(thing_list, thing_index)
ok, więc to jest uproszczone, ale masz pomysł. Teraz thing
może nie być na liście, w takim przypadku chcę przekazać -1 jako thing_index
. W innych językach tego można się spodziewać, index()
gdyby nie mógł znaleźć elementu. W rzeczywistości rzuca ValueError
.
Mógłbym to zrobić:
try:
thing_index = thing_list.index(thing)
except ValueError:
thing_index = -1
otherfunction(thing_list, thing_index)
Ale to wydaje się brudne, a ponadto nie wiem, czy ValueError
można by go podnieść z innego powodu. Wymyśliłem następujące rozwiązanie oparte na funkcjach generatora, ale wydaje się ono nieco skomplikowane:
thing_index = ( [(i for i in xrange(len(thing_list)) if thing_list[i]==thing)] or [-1] )[0]
Czy istnieje czystszy sposób na osiągnięcie tego samego? Załóżmy, że lista nie jest posortowana.
str.find
metoda, która dokładnie to robi: zwraca, -1
gdy igła nie została znaleziona w temacie.
str.index()
zgłasza wyjątek, jeśli szukany ciąg nie zostanie znaleziony.
thing_index
”. - To jest zdecydowanie nie-Pythonic. Przekazywanie (bezsensownej) wartości tokenu w przypadku, gdy operacja się nie powiedzie, jest mile widziane - wyjątki są tutaj naprawdę właściwą drogą. Zwłaszcza, żething_list[-1]
jest to prawidłowe wyrażenie, czyli ostatni wpis na liście.