Существует ли методика пропуска диапазона в циклах FOR в Python? - PullRequest
2 голосов
/ 14 февраля 2012

Давайте представим (поскольку это правда), что у меня есть скрипт Python (3), который должен выполнять итерацию по двумерному массиву (любой длины, но каждый элемент - это просто массив из 2-х целых, как показано в списке ниже).

linCirc  = [[1,10],
            [2, 1],
            [0, 2],
            [2, 2],
            [2, 3],
            [2, 4],
            [2, 0],
            [2, 5]]

Я хочу рекурсивно повторить эту прекрасную вещь, чтобы

for element in linCirc:
    if element[0] == 0:
        # skip element[1] elements

По сути, все, что мне нужно знать, - это лучший способ зацикливаться на linCirc, а затем, когда определенные условиявстретившись, вместо перехода с linCirc.index(element) на linCirc.index(element) + 1, я могу контролировать пропуск и пропускать ноль или более элементов.Например, вместо того, чтобы перейти от [0, 2] до [2, 2], я мог бы перейти от [0, 2] до [2, 4].Это лучший способ сделать это?Должен ли вообще быть задействован цикл for?

Для любопытных: Этот код предназначен для линеаризации электрической цепи, так что любая цепь (с ограниченными компонентами, скажем, на данный момент только резисторами и батареями) может быть представлена2D массив (например, linCirc).Я опубликую свой полный код, если хотите, но я не хочу засорять его бесполезным кодом.

Ответы [ 2 ]

4 голосов
/ 14 февраля 2012

Для поддержки произвольной итерации (не только последовательности, такие как список) вы можете использовать рецепт consume() :

it = iter(linCirc)
for element in it:
    if element[0] == 0:
       # skip element[1] elements
       n = element[1]
       next(islice(it, n, n), None) # see consume() recipe from itertools docs
    print(element)

пример

4 голосов
/ 14 февраля 2012
index = 0
while index < linCirc.length:
   if linCirc[index][0] == 0:
       index = index + linCirc[index][1]
   else:
       index = index + 1

Надеемся, что это обеспечивает функциональность, которую вы ищете. Очевидно, вам нужно добавить к этому полезный код - он просто запускается от начала до конца массива. Также может быть полезно добавить проверку индекса, чтобы убедиться, что он не выходит за пределы, когда он встречает [0, i] менее чем i элементов из конца массива.

...