Я пытаюсь написать код, который бы сказал, в каком направлении go - PullRequest
0 голосов
/ 13 июля 2020

Задача: https://www.codewars.com/kata/550f22f4d758534c1100025a/train/python

Моя попытка:

array=["NORTH","SOUTH","SOUTH","EAST","WEST","NORTH","WEST"]
list=[]
for i in range(len(array)):

    if array[i]=="NORTH":
        list.append(i)
        for item in array:
            if item == "SOUTH":
                list.append(item)
                array.remove(item)
                break
        array.pop(i)
    elif array[i]=="SOUTH":
        list.append(i)
        for item in array:
            if item == "NORTH":
                list.append(item)
                array.remove(item)
                break

        array.pop(i)
    elif array[i]=="EAST":
        list.append(i)
        for item in array:
            if item == "WEST":
                list.append(item)
                array.remove(item)
                break

        array.pop(i)
    elif array[i]=="WEST":
        list.append(i)
        for item in array:
            if item == "EAST":
                list.append(item)
                array.remove(item)
                break

        array.pop(i)

    else:
        if array[i]!=None:
            print(array)
        else:
            print(list)

Проблема в том, что я пытаюсь запустить в своем терминале он показывает эту ошибку:

line 5, in <module>
    if array[i]=="NORTH":
IndexError: list index out of range

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

1 Ответ

1 голос
/ 13 июля 2020

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

Вот мое решение относительно проблемы. Возможно, это не лучшее решение, но оно проходит все тестовые случаи:

def dirReduc(arr):    
    while True:
        retry = False
        for i, val in enumerate(arr):
            if i+1 < len(arr):
                if val == "NORTH" and arr[i+1] == "SOUTH":
                    del arr[i]
                    del arr[i]
                    retry = True
                    break
                if val == "SOUTH" and arr[i+1] == "NORTH":
                    del arr[i]
                    del arr[i]
                    retry = True
                    break
                if val == "WEST" and arr[i+1] == "EAST":
                    del arr[i]
                    del arr[i]
                    retry = True
                    break
                if val == "EAST" and arr[i+1] == "WEST":
                    del arr[i]
                    del arr[i]
                    retry = True
                    break
        if retry == False:
            break
    return arr

Пояснение:

Я просмотрел все элементы в массиве. Если я получаю любую идущую подряд пару, которая может уничтожить друг друга, я удаляю их из списка. Такими парами являются: (СЕВЕР, ЮГ), (ЮГ, СЕВЕР), (ВОСТОК, ЗАПАД) и (ЗАПАД, ВОСТОК).

Я продолжаю эту операцию до тех пор, пока в списке не останется съемная пара. Наконец, я возвращаю обновленный список.

Ссылка:

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