Получить подмножество генератора - PullRequest
22 голосов
/ 11 июля 2010

У меня есть функция генератора и я хочу получить первые десять элементов из нее; моя первая попытка была:

my_generator()[:10]

Это не работает, потому что генераторы не являются подписчиками, как об этом говорит мне ошибка. Прямо сейчас я обошел это с:

list(my_generator())[:10]

Это работает, поскольку преобразовывает генератор в список; однако, это неэффективно и побеждает смысл иметь генератор. Есть ли какой-нибудь встроенный Pythonic эквивалент [:10] для генераторов?

Ответы [ 2 ]

27 голосов
/ 11 июля 2010
import itertools

itertools.islice(mygenerator(), 10)

itertools имеет ряд утилит для работы с итераторами.islice принимает аргументы start, stop и step, чтобы разрезать итератор так же, как вы бы делили список на листы.

5 голосов
/ 20 февраля 2012

для уточнения вышеприведенных комментариев:

from itertools import islice

def fib_gen():
    a, b = 1, 1
    while True:
        yield a
        a, b = b, a + b

assert [1, 1, 2, 3, 5] == list(islice(fib_gen(), 5))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...