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获得linux下所有挂载点(mount points)的方法
Apr 29 Python
pymongo实现多结果进行多列排序的方法
May 16 Python
python TCP Socket的粘包和分包的处理详解
Feb 09 Python
python将excel转换为csv的代码方法总结
Jul 03 Python
python使用tomorrow实现多线程的例子
Jul 20 Python
对pytorch中的梯度更新方法详解
Aug 20 Python
浅析PEP572: 海象运算符
Oct 15 Python
python等差数列求和公式前 100 项的和实例
Feb 25 Python
PyCharm 在Windows的有用快捷键详解
Apr 07 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 Python
Python tensorflow卷积神经Inception V3网络结构
May 06 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 获取远程网页内容的函数
2009/09/08 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
PHP PDO操作MySQL基础教程
2017/06/05 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
JavaScript获取用户所在城市及地理位置
2018/04/21 Javascript
Node.js使用Angular简单示例
2018/05/11 Javascript
小程序兼容安卓和IOS数据处理问题及坑
2018/09/18 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
[15:41]教你分分钟做大人——灰烬之灵
2015/03/11 DOTA
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
python+opencv识别图片中的圆形
2020/03/25 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
Django 再谈一谈json序列化
2020/03/16 Python
Django数据结果集序列化并展示实现过程
2020/04/22 Python
Python flask框架实现查询数据库并显示数据
2020/06/04 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
纯CSS3实现鼠标悬停提示气泡效果
2014/02/28 HTML / CSS
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
DJI全球:DJI Global
2021/03/15 全球购物
汽车销售求职自荐信
2013/10/01 职场文书
夜班门卫岗位职责
2013/12/09 职场文书
鉴定评语大全
2014/05/05 职场文书
小城镇建设汇报材料
2014/08/16 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书
2015年班组长工作总结
2015/04/10 职场文书
教师节感想
2015/08/11 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书