python list-comprehension recipe generator-expression

python - Usando mientras en la lista de comprensión o expresiones generadoras



list-comprehension recipe (2)

Esta pregunta ya tiene una respuesta aquí:

Puedo usar if y for en comprensión de lista / expresiones generadoras como

list(i for i in range(100) if i*i < 30)

Sé que esto no es lo más eficiente, pero tenga en cuenta que la condición podría ser mucho más complicada y esto es solo un ejemplo. Sin embargo, esto todavía pasa por cientos de iteraciones y solo produce un valor en las primeras 6. ¿Hay alguna manera de decirle a la expresión del generador dónde detenerse con algo como esto?

list(i for i in range(100) while i*i < 30)

Sin embargo, while no se entiende en expresiones generadoras. Entonces, mi pregunta es, ¿cómo escribo una expresión de generador con una condición de parada para que no continúe el cálculo, incluso si no produce nuevos valores?


Debido a que la sintaxis de takewhile() y dropwhile() no es la más clara , aquí están los ejemplos reales de su pregunta:

>>> [i for i in itertools.takewhile(lambda x: x*x<30, range(10))] [0, 1, 2, 3, 4, 5] >>> [i for i in itertools.dropwhile(lambda x: x*x<30, range(10))] [6, 7, 8, 9]

Sepa que el autor de itertools ha cuestionado si debe desaprobar estas funciones.


Las diversas funciones en itertools ( takewhile() viene a la mente) pueden ayudar.