Я хочу вернуть простейшее направление, установленное из списка заданных направлений.Таким образом, если установленное направление имеет "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
Итак, что не так с кодом?Почему он не ломается, несмотря на достижение условия разрыва, и как мне это исправить?