En Python 2.6 o más reciente:
Si desea StopIteration
subir si no se encuentra ningún elemento coincidente:
next(x for x in the_iterable if x > 3)
Si desea default_value
(por ejemplo None
) que se devuelva en su lugar:
next((x for x in the_iterable if x > 3), default_value)
Tenga en cuenta que necesita un par adicional de paréntesis alrededor de la expresión del generador en este caso; son necesarios siempre que la expresión del generador no sea el único argumento.
Veo que la mayoría de las respuestas ignoran resueltamente el next
incorporado y, por lo tanto, supongo que por alguna misteriosa razón están 100% enfocadas en las versiones 2.5 y anteriores, sin mencionar el problema de la versión de Python (pero no veo esa mención en las respuestas que hacen mencionan el next
incorporado, por lo que pensé que es necesario proporcionar una respuesta a mí mismo - por lo menos el tema "versión correcta" se pone en el registro de esta manera ;-).
En 2.5, el .next()
método de iteradores aumenta inmediatamente StopIteration
si el iterador termina inmediatamente, es decir, para su caso de uso, si ningún elemento en el iterable cumple la condición. Si no te importa (es decir, sabes que hay debe haber al menos un elemento satisfactorio), simplemente use .next()
(mejor en un genexp, línea para el next
incorporado en Python 2.6 y mejor).
Si haces el cuidado, las cosas envolver en una función como se había indicado por primera vez en su Q parece mejor, y mientras que la implementación de la función usted propuso está bien, podría utilizar alternativamente itertools
, un for...: break
bucle, o una genexp, o una try/except StopIteration
como el cuerpo de la función , como lo sugirieron varias respuestas. No hay mucho valor agregado en ninguna de estas alternativas, así que elegiría la versión simple que propusiste por primera vez.