为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

富国沪深 2022-01-18 17:10:25
Python中有没有办法同时生成多个输出。特别是我想要类似的东西:my_gen =(i for i in range(10))并说我有一个参数batch_size = 3。我希望我的生成器输出:my_gen.next()0,1,2my_gen.next()3,4,5my_gen.next()6,7,8my_gen.next()9,10where 在最后一个命令中,它只产生两个数字,因为即使batch_size是 3,也只剩下两个数字。
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

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


查看完整回答
反对 回复 2022-01-18
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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,没有更多的值可以迭代


查看完整回答
反对 回复 2022-01-18
?
慕容森

TA贡献1853条经验 获得超18个赞

您可以将列表推导与生成器一起使用:


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)


查看完整回答
反对 回复 2022-01-18
  • 3 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信