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去除所有html标签的方法
May 05 Python
在Python中操作字典之update()方法的使用
May 22 Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 Python
Selenium元素的常用操作方法分析
Aug 10 Python
解决python3 pika之连接断开的问题
Dec 18 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
python爬取内容存入Excel实例
Feb 20 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
python自定义时钟类、定时任务类
Feb 22 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
Aug 05 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
python爬虫 urllib模块url编码处理详解
Aug 20 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数组相关函数汇总
2015/03/24 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
PHP 实现base64编码文件上传出现问题详解
2020/09/01 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
页面中js执行顺序
2009/11/09 Javascript
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
AngularJs1.x自定义指令独立作用域的函数传入参数方法
2018/10/09 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
python 字符串格式化代码
2013/03/17 Python
Python3 能振兴 Python的原因分析
2014/11/28 Python
构建Python包的五个简单准则简介
2015/06/15 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
Python Flask基础教程示例代码
2018/02/07 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
Python编写打字训练小程序
2019/09/26 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
Python turtle画图库&&画姓名实例
2020/01/19 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
HTML5 客户端数据库简易使用:IndexedDB
2019/12/19 HTML / CSS
机关门卫岗位职责
2013/12/30 职场文书
大学运动会入场词
2014/02/22 职场文书
电子工程专业毕业生求职信
2014/03/14 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
个人求职信格式范文
2015/03/20 职场文书
十八大观后感
2015/06/12 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书