首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >让python迭代器倒退?

让python迭代器倒退?
EN

Stack Overflow用户
提问于 2010-05-06 06:23:07
回答 13查看 59.4K关注 0票数 33

有没有什么办法可以让python列表迭代器向后返回?

基本上我有这个

代码语言:javascript
复制
class IterTest(object):
    def __init__(self, data):
        self.data = data
        self.__iter = None

    def all(self):
        self.__iter = iter(self.data)
        for each in self.__iter:
            mtd = getattr(self, type(each).__name__)
            mtd(each)

    def str(self, item):
        print item

        next = self.__iter.next()
        while isinstance(next, int):
            print next
            next = self.__iter.next()

    def int(self, item):
        print "Crap i skipped C"

if __name__ == '__main__':
    test = IterTest(['a', 1, 2,3,'c', 17])
    test.all()

运行此代码将产生以下输出:

代码语言:javascript
复制
a
1
2
3
Crap i skipped C

我知道为什么它会给我输出,但是有没有一种方法可以让我在str()方法中倒退一步?

编辑

好吧,也许说得更清楚些。我不想做完全相反的事情,基本上我想知道的是,是否有一种简单的方法可以在python中实现双向迭代器的等价物?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2010-05-06 06:30:42

不,一般来说,你不能让Python迭代器倒退。但是,如果你只想后退一步,你可以尝试这样做:

代码语言:javascript
复制
def str(self, item):
    print item

    prev, current = None, self.__iter.next()
    while isinstance(current, int):
        print current
        prev, current = current, self.__iter.next()

然后,您可以随时在prev中访问上一个元素。

如果你真的需要双向迭代器,你可以自己实现一个,但它可能会比上面的解决方案引入更多的开销:

代码语言:javascript
复制
class bidirectional_iterator(object):
    def __init__(self, collection):
        self.collection = collection
        self.index = 0

    def next(self):
        try:
            result = self.collection[self.index]
            self.index += 1
        except IndexError:
            raise StopIteration
        return result

    def prev(self):
        self.index -= 1
        if self.index < 0:
            raise StopIteration
        return self.collection[self.index]

    def __iter__(self):
        return self
票数 32
EN

Stack Overflow用户

发布于 2010-05-06 07:00:30

是我漏掉了什么还是你不能使用technique described in the Iterator section in the Python tutorial?

代码语言:javascript
复制
>>> class reverse_iterator:
...     def __init__(self, collection):
...         self.data = collection
...         self.index = len(self.data)
...     def __iter__(self):
...         return self
...     def next(self):
...         if self.index == 0:
...             raise StopIteration
...         self.index = self.index - 1
...         return self.data[self.index]
...     
>>> for each in reverse_iterator(['a', 1, 2, 3, 'c', 17]):
...     print each
... 
17
c
3
2
1
a

我知道这不会向后遍历迭代器,但我非常确定在一般情况下没有这样做的方法。相反,编写一个以相反顺序遍历离散集合的迭代器。

编辑您还可以使用reversed()函数为任何集合获取反向迭代器,这样您就不必编写自己的迭代器:

代码语言:javascript
复制
>>> it = reversed(['a', 1, 2, 3, 'c', 17])
>>> type(it)
<type 'listreverseiterator'>
>>> for each in it:
...  print each
... 
17
c
3
2
1
a
票数 10
EN

Stack Overflow用户

发布于 2010-05-06 06:49:13

根据定义,迭代器是一个具有next()方法的对象--根本没有提到prev()。因此,您要么必须缓存结果以便重新访问它们,要么重新实现迭代器,以便按您希望的顺序返回结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2777188

复制
相关文章

相似问题

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