Tengo este código que encuentra el índice más grande de un carácter específico en una cadena, sin embargo, me gustaría generar un ValueError
cuando el carácter especificado no aparece en una cadena.
Entonces algo como esto:
contains('bababa', 'k')
daría como resultado un:
→ ValueError: could not find k in bababa
¿Cómo puedo hacer esto?
Aquí está el código actual para mi función:
def contains(string,char):
list = []
for i in range(0,len(string)):
if string[i] == char:
list = list + [i]
return list[-1]
Respuestas:
raise ValueError('could not find %c in %s' % (ch,str))
fuente
raise ValueError
hacerlo en lugar de hacerloraise ValueError()
?Aquí hay una versión revisada de su código que aún funciona y además ilustra cómo generar una de
ValueError
la manera que desee. Por cierto, creofind_last()
,find_last_index()
o algo similar sería un nombre más descriptivo para esta función. A la posible confusión se suma el hecho de que Python ya tiene un método de objeto contenedor llamado__contains__()
que hace algo un poco diferente, en cuanto a pruebas de pertenencia.Actualización: una forma sustancialmente más sencilla
¡Guauu! Aquí hay una versión mucho más concisa, esencialmente de una sola línea, que probablemente también sea más rápida porque invierte (a través de
[::-1]
) la cadena antes de realizar una búsqueda hacia adelante a través de ella para el primer carácter coincidente y lo hace utilizando elindex()
método de cadena incorporado rápido . Con respecto a su pregunta real, una pequeña ventaja adicional que viene con el usoindex()
es que ya genera unValueError
cuando no se encuentra la subcadena de caracteres, por lo que no se requiere nada adicional para que eso suceda.Aquí está junto con una prueba unitaria rápida:
fuente
for
bucle. 1ª función: FALLO paracontains('foo', 'f')
.for
bucle en una respuesta, aunque uno aparece en su propio código. De todos modos mis 1ª función les muestra cómoraise
unValueError
cuando no se encuentra el carácter que es lo que pidieron. y he ilustrado cómo hacerlo en el contexto de afor
. Incluso si quieren unafor
por alguna razón, creo que otros pueden encontrar la segunda versión sin una al menos algo interesante.for
bucle, se hace de una manera responde a la pregunta real acerca de cómoraise
unValueError
cuando el personaje no se encuentra en la cadena - es decir, llamando a alguna otra cosa que lo hace por usted. También existe la posibilidad de que el OP pueda superar sufor
-fijación o lo que sea después de ver unafor
solución sans- o familiarizarse con Python más adelante.fuente
fuente