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 相关文章推荐
Pycharm导入Python包,模块的图文教程
Jun 13 Python
Python通过paramiko远程下载Linux服务器上的文件实例
Dec 27 Python
对python中字典keys,values,items的使用详解
Feb 03 Python
python判断自身是否正在运行的方法
Aug 08 Python
Python 调用 Windows API COM 新法
Aug 22 Python
python在OpenCV里实现投影变换效果
Aug 30 Python
如何利用python给图片添加半透明水印
Sep 06 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
Feb 06 Python
python框架flask入门之环境搭建及开启调试
Jun 07 Python
利用PyTorch实现VGG16教程
Jun 24 Python
Python字符串及文本模式方法详解
Sep 10 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 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 url 加密解密函数代码
2011/08/26 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
2007/03/06 Javascript
javascript 学习之旅 (1)
2009/02/05 Javascript
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
JavaScript入门之基本函数详解
2011/10/21 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
2014/08/30 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
vue自定义全局共用函数详解
2018/09/18 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
vue穿梭框实现上下移动
2021/01/29 Vue.js
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
python操作MySQL数据库具体方法
2013/10/28 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
python实现FTP服务器服务的方法
2017/04/11 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
2020/01/20 Python
vscode写python时的代码错误提醒和自动格式化的方法
2020/05/07 Python
Python对excel的基本操作方法
2021/02/18 Python
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
优秀毕业生自荐信范文
2014/01/01 职场文书
空中乘务员岗位职责
2014/03/08 职场文书
租房协议书
2014/09/12 职场文书
群众路线学习笔记范文
2014/11/06 职场文书
初中英语教学反思范文
2016/02/15 职场文书