2014-11-04 132 views
1

你能重置迭代器吗?或者有没有一种方法可以保存下一个元素而不需要迭代它呢?Python迭代器:重置迭代器?

+0

您的例子是不明确的,你说的“terator谁比之前和之后的元素更大。”你基于它计算的元素是什么,元素是在它之前还是之后。 – user3378649 2014-11-04 23:58:35

回答

1

它让我想起最后两个元素的小缓冲区保存在两个单独的变量中,一个元组,一个列表等,并与迭代器中的当前元素进行比较。

+0

如何在不调用next()的情况下获取下一个元素和前一个元素? – Rimoun 2014-11-05 00:15:23

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循环到ITER,每一次我们店里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 2014-11-05 00:13:58

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]