Why can't I iterate twice over the same data?

后端 未结 3 1418
余生分开走
余生分开走 2020-11-22 00:59

Honestly I am a little confused here, why can\'t I iterate twice over the same data?

def _view(self,dbName):
    db = self.dictDatabases[dbName]
    data = d         


        
3条回答
  •  有刺的猬
    2020-11-22 01:54

    It's because data is an iterator, an you can consume an iterator only once. For example:

    lst = [1, 2, 3]
    it = iter(lst)
    
    next(it)
    => 1
    next(it)
    => 2
    next(it)
    => 3
    next(it)
    => StopIteration
    

    If we are traversing some data using a for loop, that last StopIteration will cause it to exit the first time. If we try to iterate over it again, we'll keep getting the StopIteration exception, because the iterator has already been consumed.

    Now for the second question: What if we do need to traverse the iterator more than once? A simple solution would be to create a list with the elements, and we can traverse it as many times as needed. This is all right as long as there are few elements in the list:

    data = list(db[3])
    

    But if there are many elements, it's a better idea to create independent iterators using tee():

    import itertools
    it1, it2 = itertools.tee(db[3], n=2) # create as many as needed
    

    Now we can loop over each one in turn:

    for e in it1:
        print("doing this one time")
    
    for e in it2:
        print("doing this two times")
    

提交回复
热议问题