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

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

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

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

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

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

Ответы [ 5 ]

32 голосов
/ 07 апреля 2010

Попробуйте:

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

Возможно, вы захотите поймать StopIteration где-нибудь.Это произойдет, если итератор завершится.

9 голосов
/ 07 апреля 2010

Это коротко, питонно и работает:

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:
        #...

Редактировать:

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

with open('something.txt', 'r') as f:
    for line in f:
        if line == '!\n':
            next(f,None) # consume next line
            continue # skip this line
        # ...
7 голосов
/ 07 апреля 2010

Метод 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, сам файловый объект действует как итератор, поэтому вы можете получить тот же эффект, не вызывая readlines и не обращаясь к iter.

1 голос
/ 07 апреля 2010

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

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') )
1 голос
/ 07 апреля 2010

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

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

  if line.strip() == '!':
    skip = True
    continue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...