来自itertools.cycle generator

时间:2018-03-03 04:30:08

标签: python python-3.x itertools cycle

我的问题是我需要以列表形式从itertools.cycle生成器发送批次。

cycle采用可迭代的方式并无限期地将其循环。例如:

>>> my_cycle = itertools.cycle('abc')
>>> next(my_cycle)
'a'
>>> next(my_cycle)
'b'
>>> next(my_cycle)
'c'
>>> next(my_cycle)
'a'

等等。

问题是,我们如何从循环生成器中提供批长度n的列表,同时保留我们在循环中的位置?

所需的输出是:

c = itertools.cycle('abc')
batch_size = 2
Out[0]: ['a', 'b']
Out[1]: ['c', 'a']
Out[2]: ['b', 'c']

我发布我的解决方案以防有人遇到同样的问题。

3 个答案:

答案 0 :(得分:6)

似乎islice是为此而做的:

>>> from itertools import cycle, islice
>>> size_of_batch = 5
>>> c = cycle('abcdefg')
>>> list(islice(c, size_of_batch))
['a', 'b', 'c', 'd', 'e']
>>> list(islice(c, size_of_batch))
['f', 'g', 'a', 'b', 'c']

答案 1 :(得分:4)

>>> size_of_batch = 5
>>> c = itertools.cycle('abcdefg')
>>> [next(c) for _ in range(size_of_batch)]

['a', 'b', 'c', 'd', 'e']

>>> [next(c) for _ in range(size_of_batch)]

['f', 'g', 'a', 'b', 'c']

答案 2 :(得分:3)

为此设计了itertools recipe

from itertools import islice, cycle


def take(n, iterable):
    "Return first n items of the iterable as a list"
    return list(islice(iterable, n))


c = cycle("abcdefg")
take(5, c)
# ['a', 'b', 'c', 'd', 'e']