首页 > 解决方案 > 尝试使用 for 循环从列表中删除项目时的反向范围与正常范围

问题描述

对于这个 for 循环,这段代码:

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]

我知道它不起作用,因为通过删除列表中的项目, len(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]

为此,我们不是也改变了列表长度吗?为什么列表长度在反向范围内无关紧要?

标签: pythonpython-3.xfor-loop

解决方案


正如 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

推荐阅读