修改Itertools.cycle()

时间:2014-06-26 19:00:11

标签: python cycle itertools

我目前正在使用itertools.cycle()对象,我想知道在创建之后是否还有修改周期。以下内容:

my_cycle = itertools.cycle([1,2,3])
print my_cycle.next()
my_cycle.delete()    #function doesn't exist
print my_cycle.next()

的输出为:

1
3

有没有办法通过itertools实现这一目标?或许是另一个对象?或者我是否需要实现自己的对象才能执行此操作。

2 个答案:

答案 0 :(得分:4)

Itertools并没有提供这样的选择。您可以使用deque

构建它
from collections import deque

class ModifiableCycle(object):
    def __init__(self, items=()):
        self.deque = deque(items)
    def __iter__(self):
        return self
    def __next__(self):
        if not self.deque:
            raise StopIteration
        item = self.deque.popleft()
        self.deque.append(item)
        return item
    next = __next__
    def delete_next(self):
        self.deque.popleft()
    def delete_prev(self):
        # Deletes the item just returned.
        # I suspect this will be more useful than the other method.
        self.deque.pop()

答案 1 :(得分:2)

如果您想跳过某个值,只需拨打next一次。

如果要按周期从值中永久删除其中一个值,则可以创建一个生成器。

def skip_matching(gen, value):
    for v in gen:
        if v == value:
            continue
        yield v

然后你可以像这样包装一个循环:

>>> a = skip_matching(itertools.cycle([1,2,3]), 2)
>>> a.next()
1
>>> a.next()
3
>>> a.next()
1

如果要按位置删除下一个值(不删除与其匹配的任何其他值),则必须知道周期长度n。然后你可以跳过一个并收集n-1来创建一个新的循环。

c.next()
c = itertools.cycle(c.next() for i in range(n-1))