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