python发现列表中的num大于left和right



问题是使用迭代器从列表中找到大于左右中的数字的数字

例如,选择([0,1,0,2,0,3,0,4,0])return[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循环中的next(it)将是相同的迭代器,但next()仍然是代码中的下一个迭代器。

然后我把代码改成下面的代码,它有效。

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

有人能解释一下这里的区别吗?

第一个片段有两个问题:

  1. 每次调用next(it)时,它都会推进迭代器。如果要多次访问返回的值,则必须存储该值。再次调用next(it)不会做到这一点;它将再次推进迭代器
  2. 即使第一点不是问题,以下仍然是问题:

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

    这里的问题是短路评估。根据是否为v2>v1,这可能会也可能不会推进迭代器。

错误在这一行:

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

你下一次调用,但你没有存储返回值。你只需将其与v2进行比较。因此该值被跳过。

编辑:

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

 if v1 < v2 > v3:

最新更新