Я хочу вернуть простейшее направление, заданное из списка заданных направлений. Итак, если у набора направлений есть "SOUTH"
за которым следует "NORTH"
, или наоборот, они должны отменить друг друга; то же самое с "WEST"
за которым следует "EAST"
, или наоборот.
Так, например, если данный список направлений ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]
, правильным выходом должно быть возвращение упрощенного list ['WEST']
. Моя логика заключается в следующем:
"NORTH", "SOUTH"
), а 3 и 4 также удаляются ("EAST", "WEST"
). Итак, список теперь ['SOUTH', 'NORTH', 'WEST']
. Сравните длину списка до и после удаления; если они одинаковые, break - else, повторите. Поскольку старые и новые длины равны 7 и 3 соответственно, он повторяет этот процесс.'SOUTH', 'NORTH'
). Таким образом, список теперь становится ['WEST']
. Снова сравните длину списка до и после удаления; если они одинаковые, break - else, повторите. Поскольку старые и новые длины равны 3 и 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)
break
в Python может разорвать только самый внутренний цикл. Этоfor
, в вашем случае.while
не сломается. Либо установить флаг , который сломаетwhile
, или обернуть все в функции и использоватьreturn
в качестве многоуровневого перерыва.while
иfor
.break
только вырывается из циклаfor
.