Подтвердить что ты не робот

Почему я не могу повторять дважды по тем же данным?

Честно говоря, я немного запутался здесь, почему я не могу повторять дважды по тем же данным?

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")

Это будет печатать "делать это один раз" несколько раз (поскольку данные имеют несколько строк), однако он НЕ будет распечатывать "делать это два раза" вообще...

В первый раз, когда я перебираю данные, отлично работает, но во второй раз, когда я запускаю последний список "для строки в данных", это ничего не возвращает... поэтому выполнение его один раз работает, но не дважды...?

FYI - данные являются объектами csv.reader(в случае, если это является причиной)...

4b9b3361

Ответ 1

Это потому, что data - итератор, вы можете использовать итератор только один раз. Например:

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

next(it)
=> 1
next(it)
=> 2
next(it)
=> 3
next(it)
=> StopIteration

Если мы перемещаем некоторые данные с помощью цикла for, последний StopIteration приведет к его завершению в первый раз. Если мы попытаемся повторить его снова, мы продолжим получать исключение StopIteration, потому что итератор уже был использован.

Теперь для второго вопроса: что, если нам нужно переходить через итератор более одного раза? Простым решением было бы создать список с элементами, и мы можем проходить его столько раз, сколько необходимо. Это все в порядке, если в списке есть несколько элементов:

data = list(db[3])

Но если есть много элементов, лучше создать независимые итераторы, используя tee():

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

Теперь мы можем поочередно перебирать по очереди:

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

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

Ответ 2

Как только итератор исчерпан, он больше ничего не даст.

>>> it = iter([3, 1, 2])
>>> for x in it: print(x)
...
3
1
2
>>> for x in it: print(x)
...
>>>

Ответ 3

Я хочу выполнить ответ @ÓscarLópez для тех, кто ищет решение в 2017 году и использует python 2.7 или 3.

Метод tee() теперь не принимает аргументы ключевого слова и ожидает, что второй аргумент будет целочисленным, а не ключевым словом. Это правильный способ использования tee():

import itertools
it1, it2 = itertools.tee(db[3], 2)