有没有什么办法可以让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中实现双向迭代器的等价物?
发布于 2010-05-06 06:30:42
不,一般来说,你不能让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
发布于 2010-05-06 07:00:30
是我漏掉了什么还是你不能使用technique described in the Iterator section in the Python tutorial?
>>> 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()
函数为任何集合获取反向迭代器,这样您就不必编写自己的迭代器:
>>> it = reversed(['a', 1, 2, 3, 'c', 17])
>>> type(it)
<type 'listreverseiterator'>
>>> for each in it:
... print each
...
17
c
3
2
1
a
发布于 2010-05-06 06:49:13
根据定义,迭代器是一个具有next()
方法的对象--根本没有提到prev()
。因此,您要么必须缓存结果以便重新访问它们,要么重新实现迭代器,以便按您希望的顺序返回结果。
https://stackoverflow.com/questions/2777188
复制相似问题