【发布时间】:2011-02-16 03:47:47
【问题描述】:
有没有办法让 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 中执行相当于 双向 迭代器的操作?
【问题讨论】:
-
只使用
reversed有什么问题?您明确希望能够倒退,还是只希望结果倒退? -
哦....你想停止中间迭代并备份吗?您可能必须缓存已遍历的列表部分并使用
reversed()遍历它 -
我可以这样做,但是这最终会导致 icky 代码,在 C++ 中我们支持双向迭代。
-
@uberjumper:生成器用于延迟评估序列的迭代器协议的概念使得通用双向迭代器在 Python 中更难实现。最好的办法是使用自定义迭代器对集合进行索引,该迭代器跟踪索引并像 Tamás 实现的那样备份。