Использование while в понимании списка или выражениях генератора [дубликат]

этот вопрос уже есть ответ здесь:

Я могу использовать 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 ответов


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


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

>>> [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 был допрошен следует ли осуждать эти функции.