Tengo un código que se parece a esto:
thing_index = thing_list.index(thing)
otherfunction(thing_list, thing_index)
ok, eso está simplificado, pero entiendes la idea. Es thing
posible que ahora no esté en la lista, en cuyo caso quiero pasar -1 como thing_index
. En otros idiomas, esto es lo que esperaría index()
devolver si no pudiera encontrar el elemento. De hecho arroja un ValueError
.
Yo podría hacer esto:
try:
thing_index = thing_list.index(thing)
except ValueError:
thing_index = -1
otherfunction(thing_list, thing_index)
Pero esto se siente sucio, además de que no sé si se ValueError
podría plantear por alguna otra razón. Se me ocurrió la siguiente solución basada en funciones de generador, pero parece un poco compleja:
thing_index = ( [(i for i in xrange(len(thing_list)) if thing_list[i]==thing)] or [-1] )[0]
¿Existe una forma más limpia de lograr lo mismo? Supongamos que la lista no está ordenada.
str.find
método que hace exactamente eso: regresa -1
cuando la aguja no se encuentra en el sujeto.
str.index()
lanza una excepción si no se encuentra la cadena de búsqueda.
thing_index
". - Esto definitivamente no es pitónico. Pasar un valor de token (sin sentido) en caso de que una operación no tenga éxito está mal visto; las excepciones realmente son la forma correcta aquí. Especialmente porquething_list[-1]
es una expresión válida, es decir, la última entrada en la lista.