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 相关文章推荐
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
Jul 04 Python
Python3基础之list列表实例解析
Aug 13 Python
使用Python的Flask框架来搭建第一个Web应用程序
Jun 04 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
Jun 14 Python
Python贪心算法实例小结
Apr 22 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 Python
python生成以及打开json、csv和txt文件的实例
Nov 16 Python
python读取并定位excel数据坐标系详解
Jun 26 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
基于python实现数组格式参数加密计算
Apr 21 Python
Python requests接口测试实现代码
Sep 08 Python
Python Unittest原理及基本使用方法
Nov 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制作静态网站的模板框架(三)
2006/10/09 PHP
用PHP的ob_start();控制您的浏览器cache!
2007/02/14 PHP
php修改时间格式的代码
2011/05/29 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
PHP输出多个元素的排列或组合的方法
2017/03/14 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
js onclick事件传参讲解
2013/11/06 Javascript
JS继承用法实例分析
2015/02/05 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
Angularjs 滚动加载更多数据
2016/03/17 Javascript
深入理解JavaScript定时机制
2016/10/27 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
[00:34]DOTA2上海特级锦标赛 Spirit战队宣传片
2016/03/04 DOTA
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
python模糊图片过滤的方法
2018/12/14 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
Django设置Postgresql的操作
2020/05/14 Python
味多美官网:蛋糕订购,100%使用天然奶油
2017/11/10 全球购物
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
经典c++面试题二
2015/08/14 面试题
就业自荐信
2013/12/04 职场文书
环境科学专业个人求职信
2013/12/15 职场文书
长安大学毕业生自我鉴定
2014/01/17 职场文书
高中运动会入场词
2014/02/14 职场文书
委托书范文
2014/04/02 职场文书
win10下go mod配置方式
2021/04/25 Golang
用Python可视化新冠疫情数据
2022/01/18 Python
前端实现滑动按钮AJAX与后端交互的示例代码
2022/02/24 Javascript