首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改Itertools.cycle()

修改Itertools.cycle()
EN

Stack Overflow用户
提问于 2014-06-26 19:00:11
回答 2查看 1.5K关注 0票数 1

我目前正在使用itertools.cycle()对象,我想知道在创建它之后是否存在修改循环的问题。以下内容如下:

代码语言:javascript
复制
my_cycle = itertools.cycle([1,2,3])
print my_cycle.next()
my_cycle.delete()    #function doesn't exist
print my_cycle.next()

将有以下产出:

代码语言:javascript
复制
1
3

有任何方法可以通过迭代工具来实现这一点吗?或者是另一个物体?或者我是否需要实现我自己的对象来做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-26 19:11:02

Itertools没有提供这样的选项。您可以使用德克构建它。

代码语言:javascript
复制
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()
票数 4
EN

Stack Overflow用户

发布于 2014-06-26 19:14:22

如果您想跳过一个值,只需调用next一次。

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

代码语言:javascript
复制
def skip_matching(gen, value):
    for v in gen:
        if v == value:
            continue
        yield v

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

代码语言:javascript
复制
>>> a = skip_matching(itertools.cycle([1,2,3]), 2)
>>> a.next()
1
>>> a.next()
3
>>> a.next()
1

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

代码语言:javascript
复制
c.next()
c = itertools.cycle(c.next() for i in range(n-1))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24438153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档