Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 跳过循环中的多次迭代_Python_Loops_Iterator_Next_Continue - Fatal编程技术网

Python 跳过循环中的多次迭代

Python 跳过循环中的多次迭代,python,loops,iterator,next,continue,Python,Loops,Iterator,Next,Continue,循环中有一个列表,我想在到达look后跳过3个元素。 在本报告中,提出了一些建议,但我未能充分利用这些建议: song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life'] for sing in song: if sing == 'look': print sing continue continue continue conti

循环中有一个列表,我想在到达
look
后跳过3个元素。 在本报告中,提出了一些建议,但我未能充分利用这些建议:

song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
for sing in song:
    if sing == 'look':
        print sing
        continue
        continue
        continue
        continue
        print 'a' + sing
    print sing
四次
continue
当然是胡说八道,使用四次
next()
是行不通的

输出应该如下所示:

always
look
aside
of
life
实际上,三次使用.next()并不是胡说八道。如果要跳过n个值,请调用next()n+1次(不要忘记将上次调用的值指定给某个对象),然后“调用”继续

要获取您发布的代码的精确副本,请执行以下操作:

song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
songiter = iter(song)
for sing in songiter:
  if sing == 'look':
    print sing
    songiter.next()
    songiter.next()
    songiter.next()
    sing = songiter.next()
    print 'a' + sing
    continue
  print sing

当然,下一次你可以用三次(这里我实际上用了四次)

然后


我认为,在这里使用迭代器和
next
就可以了:

song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
it = iter(song)
while True:
    word = next(it, None)
    if not word:
       break
    print word
    if word == 'look':
        for _ in range(4): # skip 3 and take 4th
            word = next(it, None)
        if word:
            print 'a' + word
或者,使用异常处理(正如@Steinar所注意到的,异常处理更短、更健壮):


for
使用
iter(song)
循环;您可以在自己的代码中执行此操作,然后在循环中推进迭代器;再次调用iterable上的
iter()
只会返回相同的iterable对象,因此您可以在下一次迭代中使用
for
在循环中推进iterable

使用;它在Python 2和Python 3中都能正常工作,无需调整语法:

song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
song_iter = iter(song)
for sing in song_iter:
    print sing
    if sing == 'look':
        next(song_iter)
        next(song_iter)
        next(song_iter)
        print 'a' + next(song_iter)
通过移动
print sing
队列,我们也可以避免重复自己

如果iterable超出值范围,使用
next()
这种方式可以引发
StopIteration
异常

您可以捕获该异常,但为
next()
提供第二个参数(默认值)会更容易,因为它可以忽略异常并返回默认值:

song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
song_iter = iter(song)
for sing in song_iter:
    print sing
    if sing == 'look':
        next(song_iter, None)
        next(song_iter, None)
        next(song_iter, None)
        print 'a' + next(song_iter, '')
我习惯跳过3个元素;保存重复的
next()
调用:

from itertools import islice

song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
song_iter = iter(song)
for sing in song_iter:
    print sing
    if sing == 'look':
        print 'a' + next(islice(song_iter, 3, 4), '')
islice(song_iter,3,4)
iterable将跳过3个元素,然后返回第4个元素,然后完成。在该对象上调用
next()
,从而从
song\u iter()
中检索第四个元素

演示:


只需使用一个额外的变量,您也可以在不使用iter()的情况下执行此操作:

skipcount = -1
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
for sing in song:
    if sing == 'look' and skipcount <= 0:
        print sing
        skipcount = 3
    elif skipcount > 0:
        skipcount = skipcount - 1
        continue
    elif skipcount == 0:
        print 'a' + sing
        skipcount = skipcount - 1
    else:
        print sing
        skipcount = skipcount - 1
skipcount=-1
歌曲=['always','look','on','the','bright','side','of','life']
唱歌:
如果sing=='look'和skipcount 0:
skipcount=skipcount-1
持续
elif skipcount==0:
打印a+sing
skipcount=skipcount-1
其他:
印刷歌唱
skipcount=skipcount-1
>>歌曲=[“永远”、“看”、“在”、“光明”、“在”、“在”、“在”、“在”、“在”、“在”、“在”、“在”、“在”、“在”、“在”、“在”、“生活”]
>>>计数=0
>>>而计数<(len(song)):
如果歌曲[count]=“look”:
打印歌曲[计数]
计数+=4
歌曲[计数]=“a”+歌曲[计数]
持续
打印歌曲[计数]
计数+=1
输出:
总是
看
在一边
属于
生活

但这是相当不可读的;很难弄清楚这里的意图是什么。@MartijnPieters:同意会有更好的解决方案。我只是想指出一种不同的方法。这种方法适用于所介绍的案例,但请注意,任何计算结果为False的项目都会破坏此解决方案(例如
['always'、'look'、'the']
['always'、'look',None','the']
)适用于特定的人工示例,但是不能在任意迭代器/生成器上正常工作,因为可以转到下一个元素或跳过,但是通过索引获取任意元素不是不可能(如果没有存储)就是速度慢。
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
song_iter = iter(song)
for sing in song_iter:
    print sing
    if sing == 'look':
        next(song_iter, None)
        next(song_iter, None)
        next(song_iter, None)
        print 'a' + next(song_iter, '')
from itertools import islice

song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
song_iter = iter(song)
for sing in song_iter:
    print sing
    if sing == 'look':
        print 'a' + next(islice(song_iter, 3, 4), '')
>>> from itertools import islice
>>> song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
>>> song_iter = iter(song)
>>> for sing in song_iter:
...     print sing
...     if sing == 'look':
...         print 'a' + next(islice(song_iter, 3, 4), '')
... 
always
look
aside
of
life
skipcount = -1
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
for sing in song:
    if sing == 'look' and skipcount <= 0:
        print sing
        skipcount = 3
    elif skipcount > 0:
        skipcount = skipcount - 1
        continue
    elif skipcount == 0:
        print 'a' + sing
        skipcount = skipcount - 1
    else:
        print sing
        skipcount = skipcount - 1
>>> song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
>>> count = 0
>>> while count < (len(song)):
    if song[count] == "look" :
        print song[count]
        count += 4
        song[count] = 'a' + song[count]
        continue
    print song[count]
    count += 1

Output:

always
look
aside
of
life