Как вернуть упрощенный список направлений из заданного списка направлений, исключив пары последовательных дополнительных направлений?

1

Я хочу вернуть простейшее направление, заданное из списка заданных направлений. Итак, если у набора направлений есть "SOUTH" за которым следует "NORTH", или наоборот, они должны отменить друг друга; то же самое с "WEST" за которым следует "EAST", или наоборот.

Так, например, если данный список направлений ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"], правильным выходом должно быть возвращение упрощенного list ['WEST']. Моя логика заключается в следующем:

  • Список состоит из 7 элементов. На первом проходе удаляются элементы 0 и 1 ("NORTH", "SOUTH"), а 3 и 4 также удаляются ("EAST", "WEST"). Итак, список теперь ['SOUTH', 'NORTH', 'WEST']. Сравните длину списка до и после удаления; если они одинаковые, break - else, повторите. Поскольку старые и новые длины равны 7 и 3 соответственно, он повторяет этот процесс.
  • Список теперь имеет 3 элемента. Во втором проходе элементы 0 & 1 отменяются ('SOUTH', 'NORTH'). Таким образом, список теперь становится ['WEST']. Снова сравните длину списка до и после удаления; если они одинаковые, break - else, повторите. Поскольку старые и новые длины равны 3 и 1 соответственно, он повторяет этот процесс.
  • В третьем проходе никакая пара элементов не удаляется. Сравните длину списка до и после удаления; если они одинаковые, break - else, повторите. Поскольку старые и новые длины равны 1 и 1 соответственно, он прерывает процесс и возвращает список как ['WEST'].

Мой код для реализации этого заключается в следующем:

arr = ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]

while True:
    for i in range(len(arr)):
        try:
            len_old = len(arr)
            if ( ((arr[i]=='NORTH' and arr[i+1]=='SOUTH') or (arr[i]=='SOUTH' and arr[i+1]=='NORTH')) or
                 ((arr[i]=='EAST' and arr[i+1]=='WEST') or (arr[i]=='WEST' and arr[i+1]=='EAST')) ):
                arr.remove(arr[i])
                arr.remove(arr[i])
            len_new = len(arr)

            if len_new==len_old:
                break

        except:
            pass

arr

Но проблема в том, что она никогда не заканчивается. Когда я вручную заставляю код останавливаться и проверять значение списка, а также старые и новые длины списка, он возвращает правильные значения:

print(arr)
print(len_new)
print(len_old)
>>>
['WEST']
1
1

Итак, что случилось с кодом? Почему он не сломается, несмотря на достижение условия перерыва, и как его исправить?

  • 1
    break в Python может разорвать только самый внутренний цикл. Это for , в вашем случае. while не сломается. Либо установить флаг , который сломает while , или обернуть все в функции и использовать return в качестве многоуровневого перерыва.
  • 0
    У вас есть 2 петли: while и for . break только вырывается из цикла for .
Показать ещё 3 комментария
Теги:
list
while-loop
terminate
break

1 ответ

1

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

def dirReduc(arr):

        if len(arr)<=1:

            return arr

        len_old = len(arr)
        arr = checkDirection(arr)
        len_new = len(arr)

        if len_new==len_old:
            return arr
        else:
            arr= dirReduc(arr)

        return arr


def checkDirection(arr):
        if len(arr)<=1:
            return arr
        for i in range(len(arr)-1):
            try:
                if ( ((arr[i]=='NORTH' and arr[i+1]=='SOUTH') or (arr[i]=='SOUTH' and arr[i+1]=='NORTH')) or
                     ((arr[i]=='EAST' and arr[i+1]=='WEST') or (arr[i]=='WEST' and arr[i+1]=='EAST')) ):
                    arr.remove(arr[i])
                    arr.remove(arr[i])
                    return arr
            except:
                print('Catching Except')
                return arr



    main_arr = ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]
    main_arr = dirReduc(main_arr)
    print('Final Result')
    print(main_arr)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню