область видимости в цикле while + for и оператор if - PullRequest
0 голосов
/ 30 августа 2018

Цель этого кода - попытаться вывести маршрут, в котором второй элемент одного кортежа совпадает с первым элементом другого кортежа.

Когда i + = 1 имеет тот же отступ, что и для цикла, "JFK" является источником, path = сегменты. Я получил ['JFK', 'DEN', 'SFO', 'LAS', 'LAX', 'ORD', 'ATL'], который является правильным ответом.

Когда i + = 1 имеет тот же отступ, что и оператор if, я получаю только ['JFK', 'DEN', 'SFO', 'LAS']. Кто-нибудь знает почему ???

segments = [
            ("JFK", "DEN"),
            ("DEN", "SFO"),
            ("SFO", "LAS"),
            ("LAS", "LAX"),
            ("LAX", "ORD"),
            ("ORD", "ATL"),
            ("ATL", "JFK"),
]

def get_route(path, origin):
    my_list = []
    i = 0
    list_len = len(path)
    path_copy = path.copy()

    while i <= list_len:
        for k in path_copy:
            if origin == k[0] and origin not in my_list:
                my_list.append(k[0])
                origin = k[1]
                path_copy.remove(k)
        i += 1
    return my_list

get_route(segments, "JFK")

Ответы [ 2 ]

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

Если оператор i += 1 имеет тот же отступ, что и оператор if (он находится в цикле for), то ваша программа пропустит несколько узлов пути. Это потому, что если оператор if оценен как ложный, i будет увеличен, но вы не добавитесь в список путей.

Даже с i += 1 вне цикла for это не имеет смысла. Когда я запустил код, path_copy стал пустым, когда i = 4, но i продолжает увеличиваться, пока не достигнет 7 в вашем случае. Вот обновленная версия вашего кода, которая может работать на вас.

def get_route(path, origin):
    my_list = []
    list_len = len(path)
    path_copy = path.copy()

    while len(my_list) < list_len:
        for k in path_copy:
            if origin == k[0] and origin not in my_list:
                my_list.append(k[0])
                origin = k[1]
                path_copy.remove(k)
    return my_list
0 голосов
/ 30 августа 2018

Ну, ваше намерение состоит в том, чтобы зацикливаться столько раз, сколько элементов в списке. Если это так, i +1 находится на правильном уровне отступа. Каждая итерация цикла while приводит к увеличению i на единицу.

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

В качестве примечания, этот тип цикла довольно необычен для Python. Есть более обычные способы написания этого.

def get_route(path, origin):

    my_list = []
    path_copy = path.copy()

    for _ in path:
        for k in path_copy:
            if origin == k[0] and origin not in my_list:

                my_list.append(k[0])

                origin = k[1]

                path_copy.remove(k)

         i += 1

    return my_list

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

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