web-dev-qa-db-ja.com

ループ内の複数の反復をスキップpython

ループ内にリストがあり、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
_
36
Mehdi Nellen

foriter(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
_
46
Martijn Pieters
>>> 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
6
demo.b

ここでは、イテレータと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
4
bereal

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
2
SaeX

実際、.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
2
radomaj

もちろん、次に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
2
hivert