Использование выражений в списках или генераторах - PullRequest
19 голосов
/ 01 апреля 2011

Я могу использовать if и for в списках / выражениях генератора как

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

Я знаю, что это не самое эффективное, но терпите меня, так как состояние может быть намного сложнее, и это только пример. Тем не менее, это все еще проходит сотню итераций и дает значение только в первых 6. Есть ли способ сообщить выражению генератора, где остановиться следующим образом:

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

Однако, while не понимается в выражениях генератора. Итак, мой вопрос: как мне написать выражение генератора с условием остановки, чтобы оно не продолжало вычисление, даже если оно не дает новых значений.

Ответы [ 2 ]

25 голосов
/ 30 августа 2011

Поскольку синтаксис takewhile() и dropwhile() не является ясным , вот фактические примеры вашего вопроса:

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

Знайте, что автор itertools задал вопрос о том, не рекомендуется ли использовать эти функции.

14 голосов
/ 01 апреля 2011

Различные функции в itertools (на ум приходит takewhile()) могут помочь.

...