Ошибка возникает из-за того, что вы перебираете список и удаляете элементы во время каждой итерации.В целом, изменение базового объекта, который вы перебираете, опасно и приведет к интересным ошибкам независимо от языка, на котором вы работаете. Как начинающий программист, вам следует избегать такой практики, если у вас нет веских причин для этого..
Как было предложено, хорошим способом избежать этого является создание копии базового списка и удаление элементов из копии, а не объекта, по которому вы выполняете итерацию.Если вы сделаете это, убедитесь, что вы делаете это правильно .
В качестве другого возможного решения рассмотрите возможность использования словаря для сопоставления каждого направления с противоположным:
opposite = { "NORTH": "SOUTH", "SOUTH": "NORTH", "EAST": "WEST", "WEST": "EAST" }
Теперь, когда вы перебираете список, вы можете сделать
def consolidate_directions(direction_list):
directions = []
# iterating over enumerate(iterable) is like iterating
# over iterable except it gives you access to both the current
# iteration count and the current item being processed on each iteration
for i, direction in enumerate(direction_list):
# this is a trick to avoid out of bounds error when checking for
# the last element of the list. % is the modulus operator that returns
# 0 if the right hand side divides the left hand side evenly. In this
# case that would signify the first element of the list, meaning the
# current element is the last
last_index = (i - 1) % len(direction_list)
next_index = (i + 1) % len(direction_list)
if next_index == 0:
return directions
else:
if not (direction_list[next_index] == opposite[direction]) \
and not (direction_list[last_index] == opposite[direction]):
directions.append(direction)
return directions
Более общая обратная связь: большинство программистов на Python используют snake-case для имен функций (как я делал выше) вместо camel-case.Кроме того, одним из преимуществ языка Python является то, что он хорошо читается - он может читать почти как на английском языке.Не стесняйтесь использовать очень описательные имена для ваших переменных и функций.Это облегчает чтение и понимание вашего кода другими программистами, а также облегчает чтение и понимание позже.
Это хорошо описано в Руководстве по стилю PEP-8 , которому вы должны стараться следовать как можно точнее при программировании на Python.