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