генератор питонов, создающий список элементов, передаваемых из другого генератора - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь создать список пакетов из функции генератора ввода, но это не дает ожидаемый список.

def batch_generator(items, batch_size):
new = []
i = 0

for item in items: 
    new.append(item)
    i += 1
    print('new: ', new, i)
    if i == batch_size:
        print('i = batch')
        i = 0
        yield new
        new = []


def _test_items_generator():
    for i in range(10):
        yield i

print(list(map(lambda x: len(x), 
               batch_generator(_test_items_generator(), 3))))

Я пытаюсь получить вывод [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]] Урожай, по-видимому, отправляет размер batch_size вместо информации в новом списке.Пытаюсь понять, как работают эти генераторы!

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Я думаю, что проблема заключается в вашей последней строке:

print(list(map(lambda x: len(x), 
           batch_generator(_test_items_generator(), 3))))

batch_generator приводит к new, который содержит список.Ваш map(lambda x: len(x) затем возвращает len каждого списка.Затем вы выводите список длин, возвращаемых map().

. Вот код, который выдает ожидаемый результат:

def batch_generator(items, batch_size):
    new = []
    i = 0

    for item in items: 
        new.append(item)
        i += 1
        print('new: ', new, i)
        if i == batch_size:
            print('i = batch')
            i = 0
            yield new
            new = []

    yield new # yield the last list even if it is smaller than batch size

def _test_items_generator():
    for i in range(10):
        yield i

print(list( batch_generator(_test_items_generator(), 3)))
0 голосов
/ 06 июня 2018

Ваш генератор работает правильно.Но в вашем тесте вы отображаете списки результатов на их размер lambda x: len(x)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...