Как предотвратить продвижение цикла for в Python? - PullRequest
2 голосов
/ 19 августа 2011

Можно ли предотвратить переход цикла for к следующему значению в списке / итераторе, если выполняется определенное условие?

lst = list('abcde')
for alphabet in lst:
  if some_condition:
     # somehow prevent the for loop from advancing so that in the
     # next iteration, the value of alphabet remains the same as it is now
  # do something

Ответы [ 4 ]

8 голосов
/ 19 августа 2011

То, что вам нужно, это вложенный цикл while. Только при выходе из цикла while цикл for переходит к следующему значению.

alphabet = "abcdefghijklmnopqrstuvwxyz"
for letter in alphabet:
  while some_condition:
     # do something
4 голосов
/ 19 августа 2011

Вы можете использовать break для немедленного выхода из цикла или continue для перехода к следующей итерации цикла.См. http://docs.python.org/tutorial/controlflow.html для более подробной информации.

Редактировать: На самом деле, при ближайшем рассмотрении, то, что вы ищете, является довольно странным случаем.Рассматривали ли вы что-то вроде

lst = list('abcde')
specialcase = ""
for alphabet in lst:
  if specialcase != "":
       alphabet = specialcase
       specialcase = ""
  elif some_condition:
     # somehow prevent the for loop from advancing so that in the
     # next iteration, the value of alphabet remains the same as it is now
     specialcase = alphabet
  #do something

Вам придется изменить это в соответствии с вашей конкретной ситуацией, но это должно дать вам идею.

2 голосов
/ 19 августа 2011

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

>>> i = 0
>>> j = 0
>>> abc = 'abcdefg'
>>> while i < len(abc):
...     print abc[i]
...     if abc[i] == 'd' and j == 0:
...         print 'again'
...         j = 1
...         i -= 1
...     i += 1
a
b
c
d
again
d
e
f
g

Еще один, использующий for, но вроде хака

>>> labc
4: ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> flag
5: True
>>> for i in labc:
...     print i
...     if i == 'd' and flag:
...         flag = False
...         labc[labc.index(i):labc.index(i)] = [i]
a
b
c
d
d
e
f
g
0 голосов
/ 19 августа 2011

Я не думаю, что вы можете (или должны) сделать это с помощью обычного для list-iterator. Вы можете рассмотреть это как случай рабочей очереди и использовать цикл while:

work_stack = list('abcde')

prev_item = ''
while work_stack:
    item = work_stack.pop(0)
    print item
    if prev_item=='a' and item == 'b':
        work_stack.insert(0,item)
    prev_item = item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...