2014-11-04 2 views
1

Можете ли вы сбросить итераторы? Или есть способ сохранить следующий элемент без повторения через него?Python Iterator: перезагрузить итератор?

+0

Ваш пример не ясно, вы говорите «terator кто больше, чем элемент, до и после него.» каков элемент, который вычисляет на нем, элемент до/после него. – user3378649

ответ

1

Мне кажется, что для хранения небольшого буфера двух последних элементов в двух отдельных переменных, кортежа, списка и т. Д. И сравнения с текущим элементом в итераторе.

+0

Как получить следующий элемент и предыдущий элемент без вызова next()? – Rimoun

0

Исключая случаи, когда элемент находится в краю (голова, хвост), мы перемещаем элемент, сравнивая каждый элемент с предшественником/преемником, если он проверяет критерии, мы добавляем его в список.

x= [0,1,-1,3,8,4,3,5,4,3,8] 

s= [ x[i] for i in xrange(1,len(x)-2) if x[i-1]< x[i] and x[i]> x[i+1] ] 

print s #Output: [1, 8, 5] 

UPDATE

В этом случае мы будем использовать while в петлю в ИТЭР, и каждый раз, когда мы храним datat в трех переменных слева, в середине, справа. Всякий раз, когда мы вызываем следующую переменную, мы перемещаем середину влево, последний в середину и сохраняем следующее новое значение последним.

l= iter([0,1,-1,3,8,4,3,5,4,3,8]) 

res= [] 

left,middle,last= l.next(),l.next(),l.next() #Initialize data, we assume that we have at least 3 items, otherwise, we will get exception 

while True: 
    try: 
     if left<middle and middle>last: # I made first, to check in case we got that case in the first three items 
      res+=[middle] 
     left=middle 
     middle= last 
     last= l.next() 
    except StopIteration: 
     break 

print res #Output: [1, 8, 5] 
+0

Проблема в том, что я не могу сделать x список. X - итератор. next (x) = 0, next (x) = 1, next (x) = - 1, next (x) = 3 .... Также для головы и хвоста они просто рассматривают одну сторону из них, конечная сторона всегда была бы правдой. – Rimoun

3

Вы можете использовать itertools.tee «помнить» предыдущие значения итератора

>>> from itertools import tee, izip 
>>> it = iter([0,1,-1,3,8,4,3,5,4,3,8]) 
>>> it1, it2, it3 = tee(it, 3) 
>>> next(it2) 
0 
>>> next(it3) 
0 
>>> next(it3) 
1 
>>> [j for i, j, k in izip(it1, it2, it3) if i <j> k] 
[1, 8, 5] 
Смежные вопросы