Пропуск итераций в ForL oop, чтобы уменьшить сложность времени - PullRequest
1 голос
/ 21 апреля 2020

Предположим, у меня есть список из 1000 значений, однако меня не интересуют значения между 111 и 889. Есть ли способ в python полностью пропустить итерации для l oop без использования оператора continue для уменьшения сложность времени? Кажется, что тратить на l oop 1000 раз, когда мне нужно только запустить его 222 раза.

l = [1,2,3,111,5,6,7,8,9,889,12,2,111,4,5,6,889]
for i in l:
    if i == 111:
        // skip to 889
    else:
        // do stuff

В этом списке может быть несколько вхождений 111 и 889, и все значения между ними следует пропустить. Если после 111 нет 889, то для l oop должно заканчиваться

Ответы [ 3 ]

1 голос
/ 21 апреля 2020

Вы можете создать два фрагмента вашего итерируемого, а затем объединить их в цепочку для их повторения:

1 голос
/ 21 апреля 2020

Вы можете использовать while l oop.

idx = 0
while idx < 1000:
    if idx == 111:
        idx = 889
    else:
        # do stuff
        idx += 1

Боюсь, для вашего отредактированного вопроса нет лучшего способа, чем просмотреть весь список с помощью continue поскольку вы не знаете, где в списке появляется 889.

0 голосов
/ 21 апреля 2020

Вы полностью изменили вопрос между ними. Одна вещь, которую вы должны заметить: если у вас есть несортированный список длины, независимо от того, что вы делаете, O(n) - лучший вариант.

Если список имеет какой-либо шаблон или производную от формулы, или имеет период c, возможна небольшая оптимизация.

Вы можете немного оптимизировать, используя такие библиотеки, как numpy, вы может получить хорошую оптимизацию только в том случае, если ваш входной массив также является массивом numpy, в противном случае используйте itertools, filter et c, если вы используете только список

# with numpy
import numpy
a = numpy.array([1,2,3,111,5,6,7,8,9,889,12,2,111,4,5,6,889])
filter_array = a[numpy.logical_or(a < 111, a >889)]

#with filter
l = [1,2,3,111,5,6,7,8,9,889,12,2,111,4,5,6,889]
filter_list_gen = filter(lambda x : x > 889 or x < 111, l)
for l in filter_list_gen:
    #  do the stuff
    pass
  • Numpy идеально подходит для манипуляции с массивами, вам нужно будет запустить l oop, плюс numpy фильтрацию l oop, но это поможет вам иметь много манипуляций с массивами в целом

  • фильтр идентификатора, как обычная итерация, но немного быстрее , это как ленивый eval.

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