
Python 遍历列表删除操作时不能正确删除
创建一个新列表取出满足条件的元素比如:
发布日期:2021-05-07 23:04:24
浏览次数:20
分类:精选文章
本文共 1244 字,大约阅读时间需要 4 分钟。
当我们在Python中对列表进行删除操作时,可能会遇到一些意想不到的问题。例如,假设我们有一个列表 ls = [1,2,3,4,5]
,然后尝试通过遍历列表进行删除操作:
for i in ls: if i > 1: ls.remove(i)
结果得到的列表变成了 [1,3,5]
。这看似只是简单的删除操作,但实际上发生了什么?
问题分析
使用 Iterator
或索引直接遍历,然后进行删除操作会造成列表的索引溢出和结果错误
for
循环遍历列表时,列表的长度会发生变化。如果在遍历过程中删除元素,当前的索引可能会失效,导致无法正确删除元素。当删除元素时,游标会进行更新,列表的长度也会产生变化,导致结果不正确
在遍历过程中删除了元素会导致当前索引的变化,使得后续操作无法正确访问元素。在遍历中删除了元素会导致当前索引的变化
如果在遍历过程中删除了元素,列表的长度会减少,索引可能会变得不再有效。常见问题
漏删元素:
例如,在上面的代码中,当我们删除了2
后,列表变为 [1,3,4,5]
,但遍历器已经向下移动到了 3
,所以 3
也被认为是已经遍历过的元素,不会再次处理。列表的长度变短,对最初的遍历长度做了修改,导致超出索引
当使用for i in range(len(ls))
时,如果 ls
的长度在遍历过程中发生了变化,索引可能会超出范围。解决方法
有多种方法可以解决这个问题:
ls = [1,2,3,4,5]ls_num = []for num in ls: if num > 1: ls_num.append(num)# 结果 ls_num = [2,3,4,5]
这样可以避免直接在原列表上进行删除操作,减少误操作的可能性。
- 利用
ls[:]
方法对列表进行复制,操作不会影响原列表比如: - 采用倒序遍历列表例如:
- 在倒序遍历时,使用
range(len(ls)-1, -1, -1)
是正确的,因为列表索引是从0
开始的。 - 在进行删除操作时,始终使用
pop(i)
而不是del ls[i]
,因为pop(i)
会自动调整列表的长度,避免索引失效。
ls = [1,2,3,4,5]for i in ls[:]: if i > 1: ls.remove(i)# 结果 ls = [1]
这种方法的好处是,遍历的是拷贝后的列表,不会因为删除操作而改变原列表的状态。
ls = [1,2,3,4,5]for i in range(len(ls)-1, -1, -1): if ls[i] > 1: ls.pop(i)# 结果 ls = [1,2,3,4,5]
这种方法的好处是,倒序删除可以避免索引失效的问题,同时也比较节省内存。
注意事项
通过以上方法,可以有效避免在遍历和删除操作时出现的问题,确保代码的正确性和稳定性。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月24日 02时23分43秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LHCM万汇:在需求上升中,美国贸易赤字创下历史新高
2019-03-05
Mybatis的入门01
2019-03-05
Vue01常见指令,axios
2019-03-05
Vue路由嵌套刷新后页面没有重新渲染
2019-03-05
Vue使用bus进行组件间、父子路由间通信
2019-03-05
数据库三个级别封锁协议
2019-03-05
函数与指针分析、回调函数
2019-03-05
类的实例
2019-03-05
tomcat加载部署webapps目录下的项目
2019-03-05
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
2019-03-05
方法重写
2019-03-05
Threading Programming Guide(多线程编程指南)
2019-03-05
Java求逆波兰表达式的结果(栈)
2019-03-05
SDWebImage--http图片加载不出来的问题
2019-03-05
Application received signal SIGSEGV
2019-03-05
MySQL删除数据库时的错误(errno: 39)
2019-03-05
Win10 JDK配置环境变量以及为什么需要配置每部分的原因
2019-03-05
ubuntu学习笔记-常用文件、命令以及作用(hosts、vim、ssh)
2019-03-05
SLAM学习笔记-求解视觉SLAM问题
2019-03-05
target加载不出文件的原因之一
2019-03-05