Eu tenho um código parecido com este:
thing_index = thing_list.index(thing)
otherfunction(thing_list, thing_index)
ok isso é simplificado, mas essa é a idéia. Agora thing
pode não estar realmente na lista, caso em que desejo passar -1 como thing_index
. Em outras linguagens, isso é o que você esperaria index()
retornar se não conseguisse encontrar o elemento. Na verdade, ele lança um ValueError
.
Eu poderia fazer isso:
try:
thing_index = thing_list.index(thing)
except ValueError:
thing_index = -1
otherfunction(thing_list, thing_index)
Mas isso parece sujo, além disso, não sei se ValueError
poderia ser criado por algum outro motivo. Eu vim com a seguinte solução baseada em funções geradoras, mas parece um pouco complexa:
thing_index = ( [(i for i in xrange(len(thing_list)) if thing_list[i]==thing)] or [-1] )[0]
Existe uma maneira mais limpa de conseguir a mesma coisa? Vamos supor que a lista não esteja classificada.
str.find
método que faz exatamente isso: retorna -1
quando a agulha não é encontrada no assunto.
str.index()
lança uma exceção se a string de pesquisa não for encontrada.
thing_index
." - Isso é definitivamente não-pitônico. Passar um valor de token (sem sentido) no caso de uma operação não ser bem-sucedida é desaprovado - as exceções realmente são o caminho certo aqui. Especialmente porquething_list[-1]
é uma expressão válida, significando a última entrada na lista.