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的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
python类:class创建、数据方法属性及访问控制详解
Jul 25 Python
Python实现的快速排序算法详解
Aug 01 Python
Python基于百度AI的文字识别的示例
Apr 21 Python
不管你的Python报什么错,用这个模块就能正常运行
Sep 14 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
tensorflow没有output结点,存储成pb文件的例子
Jan 04 Python
对Python中 \r, \n, \r\n的彻底理解
Mar 06 Python
Python Numpy中数据的常用保存与读取方法
Apr 01 Python
python函数map()和partial()的知识点总结
May 26 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
Aug 07 Python
Python 数据分析之逐块读取文本的实现
Dec 14 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解答方法
2012/02/04 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
xss防御之php利用httponly防xss攻击
2014/03/21 PHP
解决微信授权回调页面域名只能设置一个的问题
2016/12/11 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
2011/08/02 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
基于JavaScript实现点击页面任何位置返回
2016/08/31 Javascript
Javascript设计模式之装饰者模式详解篇
2017/01/17 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
JavaScript实现的联动菜单特效示例
2019/07/08 Javascript
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
小米5s微信跳一跳小程序python源码
2018/01/08 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
python进度条显示之tqmd模块
2020/08/22 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
python 数据类型强制转换的总结
2021/01/25 Python
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
美国球鞋寄卖网站:Stadium Goods
2018/05/09 全球购物
Omio俄罗斯:一次搜索公共汽车、火车和飞机的机票
2018/11/17 全球购物
艺术用品:Arteza
2018/11/25 全球购物
应届生的求职推荐信范文
2013/11/30 职场文书
毕业生写求职信的要点
2014/03/04 职场文书
入党自荐书范文
2014/03/09 职场文书
春节请假条
2014/04/11 职场文书
施工安全责任协议书
2016/03/23 职场文书