Python - ограничение выдачи генератором по количеству элементов

Вопрос сугубо технический Дефолтно генератор [x for x in list if f()] вернет все элементы из множества list соответствующие условию f(). Мне необходимо ограничить эту выдачу по количеству, что бы было, например, не более 10 элементов на выходе.

Дело вот какое, насколько я понимаю если в f() забита какая-нибудь интересная формула, то генератор совершит эту операцию некоторое множество раз, при объеме списков в 10 000, будет произведено 10 000 операций, в то время как мне они ну вот совершенно не нужны.

Пока в голову приходит только написание отдельной функции обработки множества, но это получается на каждый генератор(а их у меня очень много) - придется писать свою функцию.

В общем вопрос еще раз - как ограничить объем выдачи генератора. Может как то можно прикрутить каунтер?


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

itertools.islice:

list(itertools.islice((x for x in list if f()), 10))
#                     ------------------------

Обратите внимание что квадратные скобки вокруг вашего выражения стали круглыми. Это генератор, он ленивый. f будет вызываться только до тех пор как вернёт True десять раз, не более.

P.S. Квадратные скобки - не генератор (который ленивый), а list comprehension (который жадный).

→ Ссылка