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爬取可用的代理IP
Aug 18 Python
Python编程实战之Oracle数据库操作示例
Jun 21 Python
python实现对excel进行数据剔除操作实例
Dec 07 Python
Django 生成登陆验证码代码分享
Dec 12 Python
名片管理系统python版
Jan 11 Python
Python实现确认字符串是否包含指定字符串的实例
May 02 Python
Python实现的批量修改文件后缀名操作示例
Dec 07 Python
Python切割图片成九宫格的示例代码
Mar 10 Python
pyecharts动态轨迹图的实现示例
Apr 17 Python
python调用win32接口进行截图的示例
Nov 11 Python
Python从文件中读取数据的方法步骤
Nov 18 Python
python解析照片拍摄时间进行图片整理
Jul 23 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懒人函数 自动添加数据
2011/06/28 PHP
CI框架中通过hook的方式实现简单的权限控制
2015/01/07 PHP
php利用递归实现删除文件目录的方法
2016/09/23 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
关于PHP中字符串与多进制转换函数的实例代码
2016/11/03 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
PHP创建单例后台进程的方法示例
2017/05/23 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
奇妙的js
2007/09/24 Javascript
javascript跨域刷新实现代码
2011/01/01 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
2016/10/11 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
ES6概念 ymbol.for()方法
2016/12/25 Javascript
JS实现最简单的冒泡排序算法
2017/02/15 Javascript
JS区分Object与Aarry的六种方法总结
2017/02/27 Javascript
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
详解如何更好的使用module vuex
2019/03/27 Javascript
Vue.js递归组件实现组织架构树和选人功能案例分析
2019/07/03 Javascript
layui前端时间戳转化实例
2019/11/15 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
python下载图片实现方法(超简单)
2017/07/21 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
Python计算信息熵实例
2020/06/18 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
解析浏览器的一些“滚动”行为鉴赏
2019/09/16 HTML / CSS
瑞士设计师家具和家居饰品网上商店:Bruno Wickart
2019/03/18 全球购物
工商管理系学生的自我评价分享
2013/11/29 职场文书
优秀团干部个人事迹
2014/05/29 职场文书
运动会加油稿100字
2014/09/19 职场文书
诉讼授权委托书
2014/10/15 职场文书
情人节活动总结范文
2015/02/05 职场文书
学习保证书怎么写
2015/02/26 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
mysql批量新增和存储的方法实例
2021/04/07 MySQL