Почему я не могу повторять дважды по тем же данным?
Честно говоря, я немного запутался здесь, почему я не могу повторять дважды по тем же данным?
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(в случае, если это является причиной)...
Ответы
Ответ 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)