Зацикливание списка Python при добавлении и повторении свежих / новых значений - PullRequest
0 голосов
/ 22 мая 2019

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

expanding = [1, 2]
# Expected functionality: continues to iterate "3" forever.
for expand in expanding:
  expanding.append(3)

Я ожидал бы, что это будет продолжаться в бесконечном цикле с повторяющейся последовательностью, выглядящей следующим образом: 1, 2, 3, 3, 3, 3, ... и т. Д.Хотя кажется, что он закрывается только на 2 из-за структуры моих выходных данных.

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

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

Ответы [ 3 ]

1 голос
/ 22 мая 2019

Вот сообщение о причинах, по которым вы не можете менять контейнер, по которому вы перебираете, даже если вы можете.

Как насчет использования цикла while и прерывания, когда вы закончитевместо:

my_list = [1,2]

while True:
    my_list.append(3)
    if #(check if out of range):
        break
1 голос
/ 22 мая 2019

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

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

seen = set()
stack = [1]
while stack:
    current = stack.pop()
    if current in seen or abs(current) > 5:
        continue
    seen.add(current)
    print 'Processed %s' % current
    stack.append(current + 1)
    stack.append(current - 1)

даст

Processed 1
Processed 0
Processed -1
Processed -2
Processed -3
Processed -4
Processed -5
Processed 2
Processed 3
Processed 4
Processed 5
1 голос
/ 22 мая 2019

Я только что попробовал это сам, используя метод 'enumerate', чтобы обернуть список, и код ниже делает то, что вы просите:

my_list = [1,2]

for i, element in enumerate(my_list):
   my_list.append(3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...