ループ内にリストがあり、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
_
4回のcontinue
は無意味であり、4回のnext()
の使用は機能しません。
出力は次のようになります。
_always
look
aside
of
life
_
for
はiter(song)
を使用してループします。独自のコードでこれを行い、ループ内でイテレータを進めることができます。反復可能オブジェクトでiter()
を再度呼び出すと、同じ反復可能オブジェクトのみが返されるため、ループ内で反復可能オブジェクトを次の反復ですぐに続くfor
で進めることができます。
next()
function ;でイテレータを進めますPython 2と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
_の行を上に移動することで、同じことを繰り返すことを避けることができます。
next()
をこのように使用するとcaniterableが値外の場合、StopIteration
例外が発生します。
その例外をキャッチすることはできますが、next()
に2番目の引数、例外を無視してデフォルトを返すデフォルト値を与える方が簡単です:
_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, '')
_
代わりに itertools.islice()
を使用して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_iter()
から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
_
>>> 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
ここでは、イテレータと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が気づいたように短く、より堅牢です):
it = iter(song)
while True:
try:
Word = next(it)
print Word
if Word == 'look':
for _ in range(4):
Word = next(it)
print 'a' + Word
except StopIteration:
break
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
実際、.next()を3回使用するのはナンセンスではありません。 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
もちろん、次に3回使用できます(ここでは実際に4回使用しています)
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
it = iter(song)
for sing in it:
if sing == 'look':
print sing
try:
sing = it.next(); sing = it.next(); sing = it.next(); sing=it.next()
except StopIteration:
break
print 'a'+sing
else:
print sing
それから
always
look
aside
of
life