Ho un codice che assomiglia a questo:
thing_index = thing_list.index(thing)
otherfunction(thing_list, thing_index)
ok quindi è semplificato ma hai capito. Ora thing
potrebbe non essere effettivamente nell'elenco, nel qual caso voglio passare -1 come thing_index
. In altre lingue questo è ciò che ti aspetteresti index()
di restituire se non riuscisse a trovare l'elemento. In effetti lancia un file ValueError
.
Potrei farlo:
try:
thing_index = thing_list.index(thing)
except ValueError:
thing_index = -1
otherfunction(thing_list, thing_index)
Ma questo sembra sporco, inoltre non so se ValueError
potrebbe essere cresciuto per qualche altro motivo. Ho trovato la seguente soluzione basata sulle funzioni del generatore, ma sembra un po 'complessa:
thing_index = ( [(i for i in xrange(len(thing_list)) if thing_list[i]==thing)] or [-1] )[0]
Esiste un modo più pulito per ottenere la stessa cosa? Supponiamo che l'elenco non sia ordinato.
str.find
metodo che fa esattamente questo: restituisce -1
quando l'ago non viene trovato nell'oggetto.
str.index()
genera un'eccezione se la stringa di ricerca non viene trovata.
thing_index
." - Questo è decisamente anti-pitonico. Il passaggio di un valore di token (privo di significato) nel caso in cui un'operazione non abbia successo è disapprovato - le eccezioni sono davvero la strada giusta qui. Soprattutto perchéthing_list[-1]
è un'espressione valida, ovvero l'ultima voce nell'elenco.