小编典典

使python迭代器向后退?

python

无论如何,要使python列表迭代器向后移动?

基本上我有这个

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()

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

a
1
2
3
Crap i skipped C

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

编辑

好吧,也许可以更清楚地说明这一点。我不想做一个完全相反的事情,基本上我想知道是否有一种简单的方法可以等效于python中的 双向 迭代器?


阅读 355

收藏
2020-12-20

共1个答案

小编典典

不,通常您不能使Python迭代器向后移动。但是,如果您只想退一步,则可以尝试如下操作:

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

如果确实需要双向迭代器,则可以自己实现一个迭代器,但它可能会带来比上述解决方案更多的开销:

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
2020-12-20