问题是使用迭代器从列表中找到大于左右中的数字的数字
例如,选择([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
有人能解释一下这里的区别吗?
第一个片段有两个问题:
- 每次调用
next(it)
时,它都会推进迭代器。如果要多次访问返回的值,则必须存储该值。再次调用next(it)
不会做到这一点;它将再次推进迭代器 -
即使第一点不是问题,以下仍然是问题:
if v2>v1 and v2>next(it):
这里的问题是短路评估。根据是否为
v2>v1
,这可能会也可能不会推进迭代器。
错误在这一行:
if v2>v1 and v2>next(it):
你下一次调用,但你没有存储返回值。你只需将其与v2进行比较。因此该值被跳过。
编辑:
顺便说一句,如果你比较多个值,下面的比较会更清晰:
if v1 < v2 > v3: