2014-11-05 22 views
0

的问题是使用iterator找到从列表中NUM谁比左右返回列表发帖越大NUM比左右

例如,选择NUMS更大([0,1,0 ,2,0,3,0,4,0])返回[1,2,3,4]

我的第一次尝试是

def select(iterable): 
    answer = [] 
    it = iter(iterable) 

    try: 
     v2 = next(it) 
     while True: 
      v1,v2= v2,next(it) 
      if v2>v1 and v2>next(it): 
       answer.append(v2) 
    except StopIteration: 
     pass 
    return answer 

此代码失败。 我认为在while循环中的下一个(它)将是相同的迭代器,但下一个()仍然是代码中的下一个。

然后我将代码更改为下面的一个,它的工作原理。

try: 
    v1,v2,v3 = next(it),next(it),next(it) 
    while True: 
     if v2>v1 and v2>v3: 
      answer.append(v2) 
     v1,v2,v3 = v2,v3,next(it) 
except StopIteration: 
    pass 

有人可以解释这里发生了什么吗?

+0

你可以这样做很容易使用枚举 – 2014-11-05 21:49:32

回答

0

有两个问题与第一个片段:

  1. 每次调用next(it)时,它前进迭代。如果您想多次访问它,则必须存储返回的值。再次调用next(it)不会那样做;它会再次推进迭代器。
  2. 即使第一点是不是一个问题,下面仍然是有问题的:

    if v2>v1 and v2>next(it): 
    

    这里的问题是short-circuit evaluation。取决于是否v2>v1,这可能会或可能不会推进迭代器。

0

错误就出在这行:

if v2>v1 and v2>next(it): 

你调用next(),但你不存储返回值。你只需将它与v2进行比较即可。所以这个值会被跳过。

编辑:

顺便说一句,如果你比较多个值,下面的对比更加清洁:

if v1 <v2> v3: