Как вернуть упрощенный список направлений из заданного списка направлений, исключив пары последовательных дополнительных направлений? - PullRequest
0 голосов
/ 27 сентября 2018

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

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

  • Список состоит из 7 элементов.В первом проходе элементы 0 и 1 удаляются ("NORTH", "SOUTH"), а 3 и 4 также удаляются ("EAST", "WEST").Таким образом, список теперь ['SOUTH', 'NORTH', 'WEST'].Сравните длину списка до и после удаления;если они одинаковые, перерыв - иначе, повтори.Поскольку старая и новая длины равны 7 и 3 соответственно, процесс повторяется.
  • В списке теперь есть 3 элемента.Во втором проходе элементы 0 и 1 отменяются ('SOUTH', 'NORTH').Таким образом, список теперь становится ['WEST'].Опять же, сравните длину списка до и после удаления;если они одинаковые, перерыв - иначе, повтори.Поскольку старая и новая длины равны 3 и 1 соответственно, процесс повторяется.
  • На третьем проходе ни одна пара элементов не удаляется.Сравните длину списка до и после удаления;если они одинаковые, перерыв - иначе, повтори.Поскольку старые и новые длины равны 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 Ответ

0 голосов
/ 27 сентября 2018

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

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)
...