2011-03-31 8 views
15

puedo usar if y for en las listas por comprensión/generador de expresiones comoUsando mientras que en la comprensión de lista o generador de expresiones

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

Sé que esto no es el más eficiente, pero toleradme como la condición podría ser mucho más complicado y esto es solo un ejemplo. Sin embargo, esto todavía pasa por cien iteraciones y sólo se obtiene un valor en la primera 6. ¿Hay una manera de decir la expresión generadora dónde parar con algo como esto:

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

Sin embargo, while no se entiende en el generador expresiones. 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 arroja nuevos valores?

+1

Solo una nota: puede generar una lista directamente usando '[i para i en el rango (100)]' – Joril

+0

Curiosamente, estaba [PEP3142] (https://www.python.org/dev/peps/ pep-3142 /) abierto en el momento en que se hizo esta pregunta. El caso de uso dado es casi exactamente este. Guido lo destruyó en mayo de 2013 –

Respuesta

9

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

20

Debido a que la sintaxis de takewhile() y dropwhile() no es el más claro , 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] 

saber que el autor de itertools has questioned si se debe despreciar estas funciones.

+0

¿Cuál sería la receta en caso de que estas funciones estén en desuso? – highBandWidth

+0

Basta con mirar los documentos de Python para [itertools.takewhile] (http://docs.python.org/library/itertools.html#itertools.takewhile) y [itertools.dropwhile] (http://docs.python.org /library/itertools.html#itertools.dropwhile). Cada uno tiene el equivalente directo de Python. – dawg

+6

no es solo 'list (itertools.takewhile (lambda x: x * x <30, rango (10)))' más fácil que una comprensión aquí – wim

Cuestiones relacionadas