Подтвердить что ты не робот

Пропустить несколько итераций в цикле python

У меня есть список в цикле, и я хочу пропустить 3 элемента после достижения look. В этом ответе было сделано несколько предложений, но я не смог их эффективно использовать:

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
4b9b3361

Ответ 1

for использует iter(song) для цикла; вы можете сделать это в своем собственном коде, а затем продвинуть итератор внутри цикла; вызов iter() в повторяющемся снова будет возвращать только тот же итерируемый объект, чтобы вы могли продвинуть итерабельность внутри цикла с помощью for, следующей справа на следующей итерации.

Переместите итератор с помощью функции next(); он работает правильно и в 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(), этот способ может вызвать исключение 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, '')

Я бы использовал 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) пропустит 3 элемента, затем вернет 4-й, а затем будет выполнен. Вызов next() на этом объекте, таким образом, извлекает 4-й элемент из 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), '')
... 
always
look
aside
of
life

Ответ 2

Я думаю, что просто использовать итераторы и 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

Ответ 3

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

Ответ 4

Собственно, использование .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

Ответ 5

Конечно, вы можете использовать три раза в следующий раз (здесь я на самом деле делаю это четыре раза)

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

Ответ 6

Вы можете сделать это без использования 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