Как перебрать постоянно обновляемый список? - PullRequest
1 голос
/ 15 октября 2019
for i in range(0, len(list_stops)):
    for j in range(1, len(list_stops[i])):
        current = stops_from_stop(list_stops[i][j])
        list_stops.extend(current)
        for k in range(0, len(current)):
            for m in range(0, len(current[k])):
                list_stops_x.extend([current[k][m]])
            if id_b in list_stops_x:
                #rest of code

list_stops - список списков. Например, [[1,2,3], [4,5,6]]

list_stops_x - это единый список всех чисел в list_stops. Например, [1,2,3,4,5,6]. Обычно используется как условие для ввода остальной части кода с оператором return в конце, поэтому цикл не повторяется.

Я считаю, что цикл заканчивается после достижения окончательного индекса первой версии list_stops, но я постоянно расширяю list_stops и хочу, чтобы цикл продолжался в расширениях. Так, например, если я расширяю [7,8,9] до list_stops в цикле, если id_b не найден, я все еще хочу, чтобы он проходил через [7,8,9], но останавливается на 6.

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

def find_path(stops, routes, stop_a, stop_b):
    id_a = stop_a[0]
    id_b = stop_b[0]
    unused = unused_stops()
    if id_b in list(unused):
        return []
    total_route = list()
    all_stops = stops_from_stop(id_a)
    list_stops_x = stops_from_stop_x(id_a)
    list_stops = stops_from_stop(id_a)
    for index in range(0, len(all_stops)):
        if id_b in all_stops[index]:
            return find_route(stops, routes, stop_a, stop_b)
    for i in range(0, len(list_stops)):
        for j in range(1, len(list_stops[i])):
            current = stops_from_stop(list_stops[i][j])
            list_stops.extend(current)
            for k in range(0, len(current)):
                for m in range(0, len(current[k])):
                    list_stops_x.extend([current[k][m]])
                    if id_b in list_stops_x:                 
                        stops_used_rev = [id_b]
                        last_route = list_stops[len(list_stops) - 1]
                        current_stop = last_route[0]
                        stops_used_rev += [current_stop]
                        for i in range(0, len(list_stops)):
                            if (current_stop in list_stops[i]) and (list_stops[i][0] == id_a):
                                stops_used_rev += [id_a]
                                break
                            elif current_stop in list_stops[i]:
                                current_stop = last_route[0]
                                stops_used_rev += [current_stop]
                        stops_used = stops_used_rev[::-1]               
                        for index in range(0, len(stops_used) - 1):                     
                            total_route.extend(find_route(stops, routes, stops[stops_used[index]], stops[stops_used[index + 1]]))
                        return total_route

stops_from_stop находит список остановок, доступных с текущей остановки, и добавляет к другому списку. stops_from_stops_x делает то же самое, но расширяет

1 Ответ

1 голос
/ 15 октября 2019

Таким образом, проблема в том, что мы используем диапазон (0, len (list_stops)), если вместо этого используем перечисление следующим образом, BEWARE INFINITE LOOP , потому что мы также продолжаем добавлять элементы в список. Так что будьте осторожны, но это должно дать желаемый результат. Я изменил некоторую часть кода, чтобы запустить его.

Перечисление позволяет получить как элемент списка (val), так и индекс, в котором мы сейчас находимся.

list_stops = [[1,2,3], [4,5,6]]
list_stops_x = [1,2,3,4,5,6]
newer = [[7, 8, 9], [10, 11, 12]]
id_b = 9

for i, val in enumerate(list_stops):
    print(val)
    for j in range(1, len(list_stops[i])):

        current = newer
        list_stops.extend(current)

        for k in range(0, len(current)):
            for m in range(0, len(current[k])):
                list_stops_x.extend([current[k][m]])

            # if id_b in list_stops_x:
            #     print("id_b in")
            #     break

РЕДАКТИРОВАТЬ 1

в вашем коде, который был в предложении редактирования, у вас есть циклы, которые выглядят следующим образом:

for i in range(0, len(list_stops)):
   ...

Их следует заменить наЧтобы устранить проблему, выполните следующие действия:

for i, val in enumerate(list_stops):
   ...

У меня трудное время для тестирования кода, но попробуйте заменить циклы for на указанный мной тип и дайте мне знать

Править2

Если мы продолжим добавлять в список конечно, он будет бесконечно повторяться, пока мы не выйдем куда-нибудь. Вы можете видеть этот пример, когда я добавляю элементы в список a из списка b , а затем удаляю элемент. Как видно из выходных данных, мы зациклились восемь раз, поэтому мы знаем, что это работает, вы должны отразить такие изменения в своем коде

a = [1, 2, 3, 4]
b = [5, 6, 7, 8]


for idx, val in enumerate(a):
    print("Loop Count: " + str(idx))
    if b:
        a.append(b[0])
        b.remove(b[0])
Loop Count: 0
Loop Count: 1
Loop Count: 2
Loop Count: 3
Loop Count: 4
Loop Count: 5
Loop Count: 6
Loop Count: 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...