Пропустить набор значений (в массиве) в цикле - Python3 - PullRequest
0 голосов
/ 28 августа 2018

У меня есть цикл для чтения данных, но нумерация не является непрерывной. Таким образом, я хочу пропустить конкретные значения. Но я только знал, как пропустить один, а не набор значений. Это мой пример кода:

for n in [x for x in range(2,m) if x!=9]:
    if n < 10:
        stationsnr = '00'+np.str(n)
    elif n < 100:
        stationsnr = '0'+np.str(n)
    else:
        stationsnr = np.str(n)

Но вместо "x! = 9" мне нужно что-то вроде if x! = Одного из этих значений [9,10,12,16, ......] (редактировать: значения хранятся в списке ). Есть предложения?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Вы можете использовать функцию enumerate () в цикле for. Он возвращает элемент списка, как обычно, но также возвращает позицию индекса. Например:

indices_to_avoid = [1,4,6]  # indices to skip over
for item, idx in enumerate(range(2, m)):
    if idx not in indices_to_avoid:
        do_something()

Как и в ответах выше, вы также можете использовать понимание списка, но если у вас длинный список исключений, понимание списка может быть длинным. Я думаю, что длинные списочные понимания трудно читать и могут запутать больше, чем простой цикл for, особенно если список comp переходит на следующую строку.

0 голосов
/ 28 августа 2018

Вы можете использовать -

if x is not in [your list]

Но было бы лучше использовать set, чем список, потому что время поиска по наборам равно O (1), что является постоянным, поскольку они хешируются.

Таким образом, ваш код может стать -

if x is not in (your set)

Кроме того, время добавления для списка равно O (N), а для набора - O (1), поэтому вставка в набор также будет быстрее (и удаление из него)

0 голосов
/ 28 августа 2018

Вы можете проверить, является ли значение членом набора:

[... if x not in {9, 10, 12, 16, }]

Установите членство тестирования O (1) постоянное время (поэтому fast !).

...