python - 尝试使用 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]
为此,我们不是也改变了列表长度吗?为什么列表长度在反向范围内无关紧要?
解决方案
正如 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
推荐阅读
- linux-kernel - 内核调用ko注册的函数到内核时是否调用try_module_get/module_get?
- javascript - 如何全局捕获 axios 错误并有时能够推翻它们
- c# - 具有 .NET 慢滚动速度的弹性搜索嵌套
- discord - Discord Commando 框架支持的部分
- ruby-on-rails - rqrcode 返回一个完全白色的 PNG
- qt - QT creator 4.10 在哪里使用 -DNO_SHIBBOLETH=1
- django - 如何在 jinja 中打破 if 语句的条件
- r - R:如何在 for 循环中创建输出表
- django - 我们可以为所有用户使用 django 内置的密码重置功能吗?(不适用于管理员)
- go - 同时运行数千个 goroutine