Ищете что-то, что позволило бы пропустить несколько циклов for, но при этом иметь доступный текущий index.
В псевдокоде это будет выглядеть примерно так:
z = [1,2,3,4,5,6,7,8]
for element in z:
<calculations that need index>
skip(3 iterations) if element == 5
Есть ли такое в Python 2?






Для этого можно использовать петлю while.
z = [1,2,3,4,5,6,7,8]
i = 0
while i < len(z):
# ... calculations that need index
if i == 5:
i += 3
continue
i += 1
Хорошо, выглядит хорошо. Между прочим, я не голосовал против вас, но я надеюсь, что тот, кто проголосовал против, увидит это и изменит его.
Хм, еще одно предложение, вы можете по ошибке пропустить лишнюю итерацию, так что взгляните на это еще раз.
Я бы перебрал iter(z), используя islice, чтобы отправить нежелательные элементы в забвение ... ex;
from itertools import islice
z = iter([1, 2, 3, 4, 5, 6, 7, 8])
for el in z:
print(el)
if el == 4:
_ = list(islice(z, 3)) # Skip the next 3 iterations.
# 1
# 2
# 3
# 4
# 8
Оптимизация
Если вы пропускаете итерации мааааааани, то в этот момент list, определяющий результат, станет неэффективным с памятью. Попробуйте итеративно использовать z:
for el in z:
print(el)
if el == 4:
for _ in xrange(3): # Skip the next 3 iterations.
next(z)
Спасибо @Netwave за предложение.
Если вам тоже нужен индекс, подумайте о том, чтобы обернуть iter вокруг вызова enumerate(z) (для python2.7 .... для python-3.x iter не нужен).
z = iter(enumerate([1, 2, 3, 4, 5, 6, 7, 8]))
for (idx, el) in z:
print(el)
if el == 4:
_ = list(islice(z, 3)) # Skip the next 3 iterations.
# 1
# 2
# 3
# 4
# 8
Я считаю, что создание «мусорного» списка - не лучший вариант. Может быть, потреблять его с помощью простого цикла? for _ in xrange(3): next(z), кстати, нет необходимости использовать iter, потому что islice уже ведет себя как итератор
Мне нравится этот ответ, но я бы изменил его порядок. Сначала next, list(islice(...)) как образовательная альтернатива.
На самом деле это не пропускает итераций цикла.