Использование while в понимании списка или выражениях генератора [дубликат]
этот вопрос уже есть ответ здесь:
- выбор списка остановок? 2 ответы
Я могу использовать 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 был допрошен следует ли осуждать эти функции.