老实说,我在这里有点困惑,为什么我不能在相同的数据上迭代两次?
def _view(self,dbName):
db = self.dictDatabases[dbName]
data = db[3]
for row in data:
print("doing this one time")
for row in data:
print("doing this two times")
这将打印出“一次这样做”几次(因为数据有几行),但它根本不会打印出“这样做两次”......
我第一次迭代数据工作正常,但第二次当我运行最后一个列表“for data in data”时,这没有返回...所以执行它一次工作但不是两次......?
仅供参考 - 数据是一个csv.reader对象(如果是这样的原因)......
3 回答
这是因为
data
是一个迭代器,你只能使用一次迭代器 . 例如:如果我们使用
for
循环遍历某些数据,那么最后StopIteration
将导致它第一次退出 . 如果我们再次尝试迭代它,我们将继续得到StopIteration
异常,因为迭代器已经被消耗掉了 .现在提出第二个问题:如果我们需要不止一次遍历迭代器怎么办?一个简单的解决方案是创建一个包含元素的列表,我们可以根据需要多次遍历它 . 只要列表中的元素很少,这样就可以了:
但是如果有很多元素,那么使用tee()创建独立的迭代器是个更好的主意:
现在我们可以轮流遍历每一个:
一旦迭代器耗尽,它将不再产生 .
我想为那些在2017年寻找解决方案并使用python 2.7或3的人完成@ÓscarLópez的答案 .
方法tee()现在不接受任何关键字参数,并等待第二个参数为整数,而不是关键字 . 这是使用tee()的正确方法: