2011-03-31 30 views
15

posso usare if e for in list comprehension/espressioni del generatore comeUtilizzando mentre in di lista o generatore di espressioni

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

So che questo non è il più efficiente ma recano con me come la condizione potrebbe essere molto più complicato e questo è solo un esempio. Tuttavia, questo va ancora attraverso centinaia di iterazioni e produce solo un valore nella prima 6. Esiste un modo per dire al generatore di espressione dove fermarsi con qualcosa di simile:

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

Tuttavia, while non è intesa nel generatore espressioni. Quindi, la mia domanda è, come faccio a scrivere un'espressione generatore con una condizione di arresto in modo che non continui il calcolo, anche se non produce nuovi valori.

+1

Solo una nota: è possibile generare una lista direttamente usando '[i for i in range (100)]' – Joril

+0

Stranamente, c'era [PEP3142] (https://www.python.org/dev/peps/ pep-3142 /) aperto al momento della domanda. Il caso d'uso dato è quasi esattamente questo. Guido l'ha ammucchiato a maggio 2013 –

risposta

9

Le varie funzioni in itertools (takewhile() vengono in mente) possono aiutare.

20

Poiché la sintassi di takewhile() e dropwhile() non è la più chiara , qui sono gli esempi reali di vostra domanda:

>>> [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] 

sapere che l'autore di itertools has questioned se deprecare queste funzioni.

+0

Quale sarebbe la ricetta nel caso in cui queste funzioni siano deprecate? – highBandWidth

+0

Basta guardare i documenti Python per [itertools.takewhile] (http://docs.python.org/library/itertools.html#itertools.takewhile) e [itertools.dropwhile] (http://docs.python.org /library/itertools.html#itertools.dropwhile). Ognuno ha l'equivalente diritto Python. – dawg

+6

non è solo 'lista (itertools.takewhile (lambda x: x * x <30, intervallo (10)))' più facile di una comprensione qui – wim