Python中remove漏删和索引越界问题的解决


Posted in Python onMarch 18, 2020

list.remove方法在删除元素的时候往往会出现漏删或者索引越界的情况示例如下:

漏删:

lst=[9,25,12,36]
for i in lst:
	if i>10:
		lst.remove(i)
print(lst)
>>>[9, 12]

那么为什么12被漏删了呢?其实原理很简单,如图:

Python中remove漏删和索引越界问题的解决

列表从下标为0开始遍历,遍历到25时,将25删除,返回一个新的列表:

Python中remove漏删和索引越界问题的解决

注意,原来的25对应的下标是1,所以系统会从下标为2的地方开始遍历,但是在新列表中,下标为2的地方变成了36,所以12就被跳过了。

解决方法:

只需要判断如果列表中删除元素,就要重新从0开始遍历列表。

lst=[9,25,12,36]
while True:
	for i in lst:
		if i>10:
			lst.remove(i)
			#如果删除了元素,退出此次遍历,开始遍历新列表
			break
	else:
		break
print(lst)
>>>[9]

索引越界:

当我们用下标遍历列表时,会出现索引越界的情况,如图:

lst=[9,25,12,36]
for i in range(len(lst)):
	# print(i)
	if lst[i]>10:
		lst.remove(lst[i])
print(lst)

IndexError: list index out of range

原理都是一样的,这里 i 的取值为 0 1 2 3 ,当删除一个元素之后,新列表的长度减少,索引变为 0 1 2 ,但是 i 还是根据原来列表的索引取值,所以当 i 取到 3 的时候,新列表没有该元素,索引越界。

解决方法一:

lst=[25,9,12,36]
j=0
for i in range(len(lst)):
	if lst[j]>10:
		# 下面以j取0为例:
		# j =0 时对应元素25被删除,
		# continue的做法的意思是判断新列表的j元素即0元素是否符合条件
		lst.remove(lst[j])
		continue
	# 如果新列表的j = 0 处不符合条件,j+1,然后再判断下一个元素。
	j+=1
print(lst)

解决方法二(推荐):

如果让索引倒序遍历列表就不会出现越界的问题了。
这样就算新列表的长度减小了,那么i 的取值是倒着取的,列表缺少一个元素对 i 的取值无影响。
例如 i 为3 的元素被删除了,新列表最高索引为2 而此时 i的下一个取值正好是 2 ,没有影响。

lst=[9,25,12,36]
for i in range(len(lst)-1,-1,-1):
	# i : 3 2 1 0
	if lst[i]>10:
		lst.remove(lst[i])
print(lst)

到此这篇关于Python中remove漏删和索引越界问题的解决的文章就介绍到这了,更多相关Python remove漏删和索引越界内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python dict remove数组删除(del,pop)
Mar 24 Python
用Python实现换行符转换的脚本的教程
Apr 16 Python
简单分析Python中用fork()函数生成的子进程
May 04 Python
python文件操作之目录遍历实例分析
May 20 Python
numpy数组拼接简单示例
Dec 15 Python
python并发2之使用asyncio处理并发
Dec 21 Python
使用python进行广告点击率的预测的实现
Jul 04 Python
Flask框架单例模式实现方法详解
Jul 31 Python
Python操作多维数组输出和矩阵运算示例
Nov 28 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
python tkinter实现下载进度条及抖音视频去水印原理
Feb 07 Python
opencv实现图像平移效果
Mar 24 Python
Python集成开发工具Pycharm的安装和使用详解
Mar 18 #Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 #Python
PyTorch加载自己的数据集实例详解
Mar 18 #Python
Python进程间通信multiprocess代码实例
Mar 18 #Python
python实现超级玛丽游戏
Mar 18 #Python
python实现超级马里奥
Mar 18 #Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 #Python
You might like
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
js和php邮箱地址验证的实现方法
2014/01/09 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
优化javascript的执行速度
2010/01/23 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
详细介绍8款超实用JavaScript框架
2013/10/25 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
layui分页效果实现代码
2017/05/19 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
python定位xpath 节点位置的方法
2019/08/27 Python
wxPython实现分隔窗口
2019/11/19 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
Python图像处理二值化方法实例汇总
2020/07/24 Python
联想瑞士官方网站:Lenovo Switzerland
2017/11/19 全球购物
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
秋天的雨教学反思
2014/04/27 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
Redis6.0搭建集群Redis-cluster的方法
2021/05/08 Redis
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers