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 thingpotrebbe 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 ValueErrorpotrebbe 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.findmetodo che fa esattamente questo: restituisce -1quando 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.