Пропустить несколько итераций в цикле

Ищете что-то, что позволило бы пропустить несколько циклов 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?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
2 686
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

На самом деле это не пропускает итераций цикла.

cs95 05.12.2018 13:08

Хорошо, выглядит хорошо. Между прочим, я не голосовал против вас, но я надеюсь, что тот, кто проголосовал против, увидит это и изменит его.

cs95 05.12.2018 13:20

Хм, еще одно предложение, вы можете по ошибке пропустить лишнюю итерацию, так что взгляните на это еще раз.

cs95 05.12.2018 13:20
Ответ принят как подходящий

Я бы перебрал 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 уже ведет себя как итератор

Netwave 05.12.2018 13:15

Мне нравится этот ответ, но я бы изменил его порядок. Сначала next, list(islice(...)) как образовательная альтернатива.

jpp 05.12.2018 13:19

Другие вопросы по теме