Как перебрать строку, используя буфер (python) - PullRequest
3 голосов
/ 21 декабря 2009

Я пытаюсь найти некоторый код, который, учитывая строку, позволит мне перебирать каждую строку, используя конструкцию цикла for, но с дополнительным требованием, что разделение для конструкций цикла не будет сбрасывать итерацию обратно в начало .

На данный момент у меня есть

sList = [line for line in theString.split(os.linesep)]
for line in SList
  ... do stuff

Но последующие циклы for сбрасывают итерацию обратно в начало.

Существует ли что-то в python для этого, или мне придется написать это с нуля?

Ответы [ 4 ]

13 голосов
/ 21 декабря 2009

Просто используйте выражение генератора (genexp) вместо понимания списка (listcomp), которое вы сейчас используете - т.е.

sList = (line for line in theString.split(os.linesep))

вот и все - если вы в остальном довольны своим кодом (разделение по os.linesep, даже если обычный текстовый ввод / вывод в Python уже переведет их в \n ...), все, что вам нужно сделать это использовать скобки (круглые) вместо скобок (квадратные), и вы получите генератор вместо списка.

Теперь, каждый раз, когда вы делаете for line in sList:, он снова начинается с того места, где остановился предыдущий (предположительно из-за break) - это то, что вы просите, верно?

2 голосов
/ 21 декабря 2009

Используйте другой итератор:

aList = range(10)
anIterator = iter(aList)

for item in anIterator:
    print item
    if item > 4: break

for item in anIterator:
    print item
0 голосов
/ 21 декабря 2009

Взломать итератор?

def iterOverList(someList):
    for i in someList:
        # Do some stuff
        yield

Тогда просто вызовите iterOverList () внутри цикла несколько раз, он сохранит состояние?

0 голосов
/ 21 декабря 2009

Попробуйте использовать комбинацию ломтиков и enumerate():

sList = theString.split(os.linesep)
for i, line in enumerate(sList):
    if foo: 
        break

for j, line in enumerate(sList[i:]):
    # do more stuff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...