python - 如何通过消除成对的连续互补方向来从给定方向列表返回简化的方向列表?

标签 python list while-loop break terminate

我想从给定方向列表中返回最简单的方向集。因此,如果方向集有 "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

那么,代码有什么问题呢?为什么达到了中断条件却没有中断,如何修复?

最佳答案

你的程序永远不会终止。外观没有任何终止条件。循环间终止可能不会对所有输入执行。我重写了代码,它适用于提供的测试用例

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)

关于python - 如何通过消除成对的连续互补方向来从给定方向列表返回简化的方向列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52528954/

相关文章:

python - Python 中是否有 sessionInfo() 等价物?

list - 为什么我们在 Scala 中创建 List 时需要 Nil?

python - 从数字转换为罗马符号

python - 根据条件删除numpy数组中的行

python - Python 中的 chr(128) .. chr(255) 有什么意义?

python - 使用 float 为 Python RNG 播种是否安全?

python - 将列表的每个元素与第二个列表的每个元素连接起来

c# - 我怎样才能快速计算字符串出现在字符串列表的给定部分中的频率?

c++ - 继续 while 循环直到 EOF (Qt)

c - 当不在 main 内部工作时