Как я могу пропустить текущий элемент и следующий в цикле Python?

Это может быть очень глупый вопрос, однако я огляделся в Интернете и т.д. И не нашел надежного ответа.

Есть ли простой способ сделать что-то вроде этого?

lines = open('something.txt', 'r').readlines()
for line in lines:
    if line == '!':
        # force iteration forward twice
        line.next().next()
    <etc>

Это легко сделать в С++; просто увеличивайте итератор до дополнительного времени. Есть ли простой способ сделать это в Python?

Я просто хотел бы указать, что основная цель этого вопроса заключается не в "чтении файлов и т.д.", а в пропуске. Я больше искал итерацию стиля итератора на С++. Также новое название немного глупо, и я действительно не думаю, что оно отражает характер моего вопроса.

Ответы

Ответ 1

Try:

lines = iter(open('something.txt', 'r'))
for val in lines:
    if val == "!":
        lines.next()
        continue
    <etc>

Возможно, вы захотите поймать StopIteration. Это произойдет, если итератор закончен.

Ответ 2

Это короткий, пифонический и работает:

with open('something.txt', 'r') as f: # or simply f = open('something.txt', 'r')
    nobang = (line for line in f if line != '!\n')
    for line in nobang:
        #...

Edit:

Как уже отмечалось, это еще не решение. Лучшее, что я могу придумать, это комбинация того, что уже есть на этой странице:

with open('something.txt', 'r') as f:
    for line in f:
        if line == '!\n':
            next(f,None) # consume next line
            continue # skip this line
        # ...

Ответ 3

Метод file.readlines возвращает список строк, а итерация по списку не позволит вам изменить итерацию в теле цикла. Однако, если вы сначала вызываете iter в списке, вы получите итератор, который вы можете изменить в теле цикла:

lines = open('something.txt', 'r').readlines()
line_iter = iter(lines)
for line in line_iter:
    if line == '!':
        # force iteration forward twice
        line_iter.next()
        line_iter.next()
    <etc>

Как указывает ebo, сам файл файл действует как итератор, поэтому вы можете получить тот же эффект, не вызывая чтения и не оставляя вызов для iter.

Ответ 4

Не очень компактно:

skip = False
for line in open('something.txt'):
  if skip:
    skip = False
    continue

  if line.strip() == '!':
    skip = True
    continue

Ответ 5

Вы можете использовать рекурсию

input = iter( open('something.txt') )
def myFunc( item ):
    val = iter.next()
    if( val == '!' ):
        item.next()
        return myFunc( item )
    #continue on with looping logic

Отредактированный пост содержал следующее, которое на самом деле не отвечало на ваш вопрос:

Вы пробовали

[line for line in open('something.txt') if line != '!']

чтобы создать новый список? Или даже лучше

filter( lambda line: line != '!', open('something.txt') )