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

时间:2019-04-22 14:47:35

标签: python list generator

Python中有没有一种方法可以同时生成多个输出。我特别想要这样的东西:

var myVar = setInterval(myTimer, 10);

function myTimer() {
  var d = new Date();
  document.getElementById("startTimeCounter").innerHTML = d.toLocaleTimeString();
}

并说我有一个参数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 为3,也只剩下两个数字。

4 个答案:

答案 0 :(得分: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])

答案 1 :(得分: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,就不再有要迭代的值

答案 2 :(得分: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)

答案 3 :(得分:0)

如果您希望迭代器/生成器具有多个批处理大小元素,则只需执行以下操作:

gen = iter(range(12))
for x, y, z in iter(lambda: [next(gen) for _ in range(3)], 1):
    print(x, y, z)

如果没有,这应该适合您的需求:

gen = iter(range(11))
for t in iter(lambda: [next(gen, None) for _ in range(3)], [None]*3):
    print(*[x for x in t if x is not None])

优点:

  1. 迭代安全
  2. 可读
  3. 不需要库