【问题标题】:i am trying to write a code that would tell which direction to go我正在尝试编写一个代码来告诉该方向
【发布时间】:2020-07-13 08:30:42
【问题描述】:

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

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

【问题讨论】:

  • 你在迭代 array 时改变了它的长度——通常是个坏主意。
  • 输入一个打印件,告诉您您正在尝试访问哪个索引或哪个项目。您会看到,当列表只有 n 个元素时,您将尝试迭代访问元素 n+1 的列表。
  • 那我该怎么办..请纠正我

标签: python python-3.x list algorithm


【解决方案1】:

不要将结果附加到新列表中,而是更新原始列表。当您的代码在删除值后尝试访问索引时,会发生索引超出范围。当我们需要更新一个列表时,我们需要使用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)。

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

参考:

【讨论】:

  • 我很高兴。有能力时接受答案并投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2021-09-09
  • 1970-01-01
相关资源
最近更新 更多