无论如何,要使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中的 双向 迭代器?
不,通常您不能使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。
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