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])
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,没有更多的值可以迭代
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)
添加回答
举报