¿Cuál es la forma más python de iterar sobre una lista hasta que se cumpla una condición?

Tengo una lista de valores reales:

values = [0.1, 2.9, 1.4, 5.7, 9.2, 3.8] 

Quiero tener el número de elementos repetidos hasta que se cumpla alguna condición. Por ejemplo, si la condición fuera item > 5 , el resultado sería 3.

La forma más fácil, y quizás la forma más sencilla de hacerlo, sería:

 for index, item in enumerate(values): if (item > 5): print(index) break 

¿Hay alguna otra forma más pythonica, preferiblemente de una sola línea , que haga esto?

Puede usar itertools.takewhile con sum que tomará elementos hasta que se cumpla la condición, usando una expresión generadora que evaluamos perezosamente:

 values = [0.1, 2.9, 1.4, 5.7, 9.2, 3.8] from itertools import takewhile print(sum(1 for _ in takewhile(lambda x: x< 5,values))) 

Su código es equivalente a la siguiente expresión del generador.

 In [1]: gen = (i for i, v in enumerate(values) if v > 5) 

next( gen ) devolverá el índice del primer elemento coincidente

 In [2]: next(gen) Out[2]: 3 

o levante StopIteration (si no hay tales elementos): si este es un problema, considere agregar algún valor predeterminado, por ejemplo, None :

 In [3]: next((i for i, v in enumerate(values) if v > 10), None) is None Out[3]: True 

o usar itertools.takewhile con sum (tenga en cuenta que necesitará negar el predicado):

 In [4]: import itertools In [5]: it = itertools.takewhile(lambda x: x <= 5, values) In [6]: sum(1 for _ in it) Out[6]: 3 

Para listas, la respuesta de Padraic! Usar NumPy es definitivamente más rápido si la estructura de datos ya es una matriz …

 In [370]: a = np.array(values) In [371]: (a>5).argmax() Out[371]: 3 

La forma más python de hacer esto es con una lista de comprensión.

 print next(ind for ind, i in enumerate([0.1, 2.9, 1.4, 5.7, 9.2, 3.8]) if i > 5)