猿问

Python创建一个输出多个项目的生成器

Python中有没有办法同时生成多个输出。特别是我想要类似的东西:


my_gen =(i for i in range(10))

并说我有一个参数batch_size = 3。我希望我的生成器输出:


my_gen.next()

0,1,2

my_gen.next()

3,4,5

my_gen.next()

6,7,8

my_gen.next()

9,10

where 在最后一个命令中,它只产生两个数字,因为即使batch_size是 3,也只剩下两个数字。


富国沪深
浏览 147回答 3
3回答

天涯尽头无女友

在itertools页面上提供了一个 grouper 功能:def grouper(iterable, n, fillvalue=None):    "Collect data into fixed-length chunks or blocks"    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"    args = [iter(iterable)] * n    return zip_longest(*args, fillvalue=fillvalue)有了它,你可以制作你的生成器并用石斑鱼包裹它:for my_tuple in grouper(my_gen, 3):    print([x for x in my_tuple if x is not None])

宝慕林4294392

IMO,不需要任何库。您可以只定义自己的批处理生成器def batch_iter(batch_size, iter_):    yield [next(iter_) for _ in range(batch_size)]并且只是next(batch_iter(batch_size, x))一个迭代安全的版本将是def batch_iter(batch_size, iter_):    r = []    for _ in range(b):        val = next(iter_, None)        if val is not None: r.append(val)    yield r当然,如果您需要元组值,您可以yield tuple(r)代替。r您也可以添加一个else子句和break循环,因为一旦val是None,没有更多的值可以迭代

慕容森

您可以将列表推导与生成器一起使用:batch_size, max_size = 3, 10my_gen = ([x for x in range(i, i + batch_size) if x <= max_size] for i in range(0, max_size, batch_size))for x in my_gen:&nbsp; &nbsp; print(x)
随时随地看视频慕课网APP

相关分类

Python
我要回答