生成器迭代器的 Batch Chop 问题

Batch Chop issue with generator iterator

我正在 coursena 中进行测试,发现循环生成器与切碎批次有关的问题:

def batch_generator(items, batch_size):
    
    for i in range(0, len(list(items)), batch_size):
        yield list[i:i+batch_size]

# Test batch generator
def _test_items_generator():
    for i in range(10):
        yield i
        
print(i)
grader.set_answer("a4FK1", list(map(lambda x: len(x), batch_generator(_test_items_generator(), 3))))

错误看起来像:

TypeError                                 Traceback (most recent call last)
<ipython-input-85-a91baa3cf6fa> in <module>()
      6 
      7 print(i)
----> 8 grader.set_answer("a4FK1", list(map(lambda x: len(x), batch_generator(_test_items_generator(), 3))))

<ipython-input-84-4e82a37b7646> in batch_generator(items, batch_size)
     12     """
     13     for i in range(0, len(list(items)), batch_size):
---> 14         yield list[i:i+batch_size]
     15 
     16     ### YOUR CODE HERE

TypeError: 'type' object is not subscriptable

我不知道应该在哪里解决我的问题。

您正在尝试为内置 list 对象添加下标。您需要将输入 (items) 转换为列表和下标:

def batch_generator(items, batch_size):
    l = list(items)
    for i in range(0, len(l), batch_size):
        yield l[i:i+batch_size]

如果您不想转换为列表(例如,当 items 本身就是一个生成器时),您也可以遍历 items 输入:

def batch_generator(items, batch_size):
    res = []
    for item in items:
        res.append(item)
        if len(res) == batch_size:
            yield(res)
            res = []
    if len(res) > 0:
        yield(res)

请注意,我们需要在循环结束时检查 res 中是否有任何剩余数据,如果有,也将其 yield。