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实现生成简单的Makefile文件代码示例
Mar 10 Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 Python
简单掌握Python中glob模块查找文件路径的用法
Jul 05 Python
python Pandas 读取txt表格的实例
Apr 29 Python
Flask之请求钩子的实现
Dec 23 Python
Python3 max()函数基础用法
Feb 19 Python
python简单验证码识别的实现方法
May 10 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
如何通过python实现全排列
Feb 11 Python
TensorBoard 计算图的查看方式
Feb 15 Python
python 链接sqlserver 写接口实例
Mar 11 Python
Python持续监听文件变化代码实例
Jul 22 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中mysql_field_type()函数用法
2014/11/24 PHP
php判断数组中是否存在指定键(key)的方法
2015/03/17 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
vue中axios实现数据交互与跨域问题
2019/05/12 Javascript
微信小程序button标签open-type属性原理解析
2020/01/21 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
2020/07/21 Javascript
JavaScript如何实现防止重复的网络请求的示例
2021/01/28 Javascript
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
详解python单例模式与metaclass
2016/01/15 Python
利用Python实现Windows定时关机功能
2017/03/21 Python
python学生信息管理系统(初级版)
2018/10/17 Python
Python3实现从排序数组中删除重复项算法分析
2019/04/03 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
基于Python爬取素材网站音频文件
2020/10/21 Python
浅谈HTML5 & CSS3的新交互特性
2016/07/19 HTML / CSS
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
外语系毕业生找工作的求职信
2013/11/28 职场文书
校园报刊亭的创业计划书
2014/01/02 职场文书
学习决心书范文
2014/03/11 职场文书
幼儿园老师寄语
2014/04/03 职场文书
社区五一劳动节活动总结
2015/02/09 职场文书
北京英语导游词
2015/02/12 职场文书
酒店财务总监岗位职责
2015/04/03 职场文书
大学生读书笔记范文
2015/07/01 职场文书
2015年度优秀员工获奖感言
2015/07/31 职场文书
多人股份制合作协议书
2016/03/19 职场文书