Пропустить индексы в Python - PullRequest
       9

Пропустить индексы в Python

0 голосов
/ 13 сентября 2018

У меня проблема с последней частью кода, который я создаю. Я пытаюсь, например, заставить список повторяться до элемента 3 в обычном режиме, но затем проверить, равен ли элемент 3 и другие условия (которые сейчас не имеют значения), а затем изменить индекс для повторения из примера 10.

Я сделал много попыток, но, похоже, это не сработало.

li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
for i in range(0,len(li)):
    print(i)
    if i == 3: #along with other condition
        def g(li):
            global i
            i = li[9]
        g()
        print(i)

Ответы [ 8 ]

0 голосов
/ 13 сентября 2018

Вы устанавливаете значение i на некоторое значение внутри вашего цикла for. В начале каждой итерации цикла for Python обновляет значение i, чтобы оно стало следующим значением в итерируемом объекте, по которому он повторяется. Поэтому ваша ценность теряется и не используется.

Одним из решений было бы использование другой переменной (skip_until), например, так:

lst = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
skip_until = -1
for i in range(len(lst)):
    if i == 3:
        skip_until = 9
    if skip_until >= i:
        continue      
    print((i, lst[i]))

выход:

(0, 1) (1, 2) (2, 3) (10, 11) (11, 12) (12, 13) (13, 14) (14, 15) (15, 16)

0 голосов
/ 13 сентября 2018

A for цикл не требуется. Если вы довольны использованием сторонней библиотеки, вы можете использовать NumPy:

import numpy as np

A = np.array(li)

res = A[np.r_[:4, 9:len(A)]]

# array([ 1,  2,  3, 10, 11, 12, 13, 14, 15, 16])

Или с обычным Python вы можете использовать slice объекты:

from operator import itemgetter
from itertools import chain

slices = (slice(0, 4), slice(9, None))

res = list(chain.from_iterable(itemgetter(*slices)(li)))

# [1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16]
0 голосов
/ 13 сентября 2018

То, что вы хотите сделать, на самом деле невозможно с циклом Python for, который меньше, чем цикл for (initializer; step; condition) в стиле Java / C, но больше похож на цикл foreach (iterable), где итеративное просто случается range в вашем случае.

Таким образом, всякий раз, когда вы делаете i = ... в вашем цикле (i является переменной из цикла for), i будет перезаписываться (не изменяться) новым значением в следующей итерации цикла .

Вместо этого вы можете использовать чуть более длинный цикл while:

i = 0
while i < len(li):
    print(i)
    if i == 3: #along with other condition
        def g(li):
            global i
            i = li[9]
        g(li)
    else:
        i += 1

Также обратите внимание, что вложенная функция g, по-видимому, не служит какой-либо цели и может быть удалена, хотя в вашем фактическом коде регистр может отличаться.

i = 0
while i < len(li):
    print(i)
    if i == 3: #along with other condition
        i = li[9]
    else:
        i += 1
0 голосов
/ 13 сентября 2018

Я пытаюсь понять, что вы сказали, и я написал этот код

li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
def k(pos = 0):
    for i in li[pos:]:
        print(i)
        if li.index(i) == 3: #along with other condition
            return k(pos = 9)
k()
0 голосов
/ 13 сентября 2018

Самый простой и читабельный способ сделать это - использовать while в отличие от цикла for, как показано ниже.

li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
i = 0
while i < len(li):
    print(i)
    if i == 3:
        i = 10
        print(i)
    i += 1 # increment i at the end of the loop
0 голосов
/ 13 сентября 2018

Следует использовать продолжить так:

li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
for i in range(0,len(li)):
    if i in range(3, li[9]):
        continue
    print(i)
0 голосов
/ 13 сентября 2018
li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
condition3_reached = False
condition10_reached = False
for i in li:
    print(i)
    if conditition3_reached and not condition10_reached and i != 10:
        continue
    if condition3_reached and i == 10:
        condition10_reached = True
    if i == 3 and (#along with other condition):
        condition3_reached = True
        print(i)
    else:
        do_some_new_thing_for_10_onwards()

это простой способ достижения того, что вы хотите. Меня беспокоит то, что он не масштабируется

0 голосов
/ 13 сентября 2018

Вы можете использовать оператор continue:

li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
for i in range(len(li)):
    if 3 <= i < 10: #along with other condition
        continue
    print(i)

вывод при печати i:

0,1,2,10,11,12,13, 14,15

вывод при печати li[i]:

1,2,3,11,12,13,14,15,16

оператор continue переносит вас в начало цикла, игнорируя все следующие условия.
вы можете захотеть взглянуть на операторы управления loop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...