обратный диапазон по сравнению с нормальным диапазоном при попытке удалить элементы из списка с помощью цикла for - PullRequest
0 голосов
/ 03 января 2019

Для этого цикла, этот код:

lst = ['NORTH', 'SOUTH', 'EAST', 'EAST']

for num in range(0, len(lst) - 1):
    if lst[num] == 'NORTH' and lst[num + 1] == 'SOUTH':
        del lst[num]
        del lst[num - 1]

Я знаю, что это не работает, потому что, удаляя элементы в списке, изменяется длина (lst), однако, почему это работает:

for num in range(len(lst) - 1 , -1 , -1):
    if lst[num] == 'SOUTH' and lst[num - 1] == 'NORTH':
        del lst[num]
        del lst[num - 1]

для этого, разве мы не меняем длину списка? Почему длина списка не имеет значения в обратном диапазоне?

1 Ответ

0 голосов
/ 03 января 2019

Как отметил DYZ в комментариях, при обратном индексировании вы изменяете индексы уже обработанных элементов, поэтому при продолжении кода не произойдет сбой.

Однако, кажется, вам повезло с вводом, поскольку вы удаляете два элемента одновременно. Если вы измените список ввода на этот, он все равно потерпит неудачу с IndexError.

lst = ['EAST', 'EAST', 'NORTH', 'SOUTH']

Если вы хотите выполнить манипуляции со списком, как это, вам лучше использовать цикл while.

num = 0
while num < len(lst) - 1:
    if lst[num] == 'NORTH' and lst[num + 1] == 'SOUTH':
        del lst[num]
        del lst[num - 1]
    else:
        num += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...