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

问题描述 投票:2回答:3

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

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

python list generator
3个回答
5
投票

itertools page上有一个石斑鱼功能提供:

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])

2
投票

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循环,因为一旦valNone,没有更多的值可以迭代


1
投票

您可以将列表理解与生成器一起使用:

batch_size, max_size = 3, 10
my_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:
    print(x)
© www.soinside.com 2019 - 2024. All rights reserved.