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实现数组插入新元素的方法
May 22 Python
python实现将html表格转换成CSV文件的方法
Jun 28 Python
python查看zip包中文件及大小的方法
Jul 09 Python
Python中条件判断语句的简单使用方法
Aug 21 Python
python开发之thread线程基础实例入门
Nov 11 Python
python3 读写文件换行符的方法
Apr 09 Python
python如何实现一个刷网页小程序
Nov 27 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
Mar 10 Python
Python爬虫JSON及JSONPath运行原理详解
Jun 04 Python
通过自学python能找到工作吗
Jun 21 Python
如何基于Python爬虫爬取美团酒店信息
Nov 03 Python
Python编写车票订购系统 Python实现快递收费系统
Aug 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
在Windows版的PHP中使用ADO
2006/10/09 PHP
PHP新手上路(十一)
2006/10/09 PHP
PHP 组件化编程技巧
2009/06/06 PHP
php发送post请求函数分享
2014/03/06 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
javascript抽象工厂模式详细说明
2014/12/16 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
利用Vue.js指令实现全选功能
2016/09/08 Javascript
NodeJS和BootStrap分页效果的实现代码
2016/11/07 NodeJs
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
jQuery实现可拖动进度条实例代码
2017/06/21 jQuery
探索webpack模块及webpack3新特性
2017/09/18 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
微信小程序的tab选项卡的实现效果
2019/05/15 Javascript
python2.x实现人民币转大写人民币
2018/06/20 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
Python页面加载的等待方式总结
2021/02/28 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
城市轨道专业个人求职信范文
2013/09/23 职场文书
毕业生的自我鉴定
2013/10/29 职场文书
中医药大学毕业生自荐信
2013/11/08 职场文书
八一建军节活动方案
2014/02/10 职场文书
战友聚会策划方案
2014/06/13 职场文书
激励口号大全
2014/06/17 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL