reverse next () в генераторе Python - PullRequest
2 голосов
/ 02 апреля 2019

Допустим, у нас есть следующий код:

gen = (x for x in range(11))

for el in gen:
    print("Printing current element: ", el) #1
    if el % 3 == 0:
        print("The next item is: ", next(gen)) #2

В этом примере я хотел бы напечатать все числа из генератора в строке #1 и дополнительно те, которые делятся на 3 в строке #2.Код должен использовать поэлементную (в отличие от индексной) итерацию.Существует также ограничение, согласно которому генератор gen должен оставаться генератором (из-за ограничений памяти) и не может использоваться, например, как список в reversed(list(gen)).

Текущая реализация заставляет числа итераций пропускать из-за next(gen).

1 Ответ

2 голосов
/ 02 апреля 2019

Вы можете использовать itertools.tee для репликации итерируемого, сместить реплицируемое итерируемое со смещением 1 с вызовом next, а затем использовать itertools.zip_longest для сопряжения двух итераций для итерации:

from itertools import tee, zip_longest
gen = (x for x in range(11))
a, b = tee(gen)
next(b)
for el, n in zip_longest(a, b):
    print("Printing current element: ", el)
    if el % 3 == 0:
        print("The next item is: ", n)

Это выводит:

Printing current element:  0
The next item is:  1
Printing current element:  1
Printing current element:  2
Printing current element:  3
The next item is:  4
Printing current element:  4
Printing current element:  5
Printing current element:  6
The next item is:  7
Printing current element:  7
Printing current element:  8
Printing current element:  9
The next item is:  10
Printing current element:  10
...