首页 > 解决方案 > 我正在尝试编写一个代码来告诉该方向

问题描述

挑战: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

如果你能帮助我解决这个问题并帮助我改进我的代码,那就太好了。

标签: pythonpython-3.xlistalgorithm

解决方案


与其将结果附加到新列表中,不如更新原始列表。当您的代码在删除值后尝试访问索引时,会发生索引超出范围。当我们需要更新一个列表时,我们需要使用enumerate而不是使用带有列表长度的 for 循环。

这是我关于挑战的解决方案。这可能不是最好的解决方案,但它通过了所有测试用例:

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

解释:

我已经遍历了数组中的所有元素。如果我得到任何可以相互消灭的连续对,我将它们从列表中删除。这样的对是:(NORTH,SOUTH),(SOUTH,NORTH),(EAST,WEST)和(WEST,EAST)。

我继续这个操作,直到列表中没有可移动的对。最后,我返回更新的列表。

参考:


推荐阅读