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 相关文章推荐
Web服务器框架 Tornado简介
Jul 16 Python
Python中Collection的使用小技巧
Aug 18 Python
用python写个自动SSH登录远程服务器的小工具(实例)
Jun 17 Python
Python实现抓取网页生成Excel文件的方法示例
Aug 05 Python
Python实现JSON反序列化类对象的示例
Jan 31 Python
PyQt实现界面翻转切换效果
Apr 20 Python
python3.4.3下逐行读入txt文本并去重的方法
Apr 29 Python
python判断一个集合是否为另一个集合的子集方法
May 04 Python
Python Django的安装配置教程图文详解
Jul 17 Python
Python常用库大全及简要说明
Jan 17 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 Python
python库skimage给灰度图像染色的方法示例
Apr 27 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通过COM类调用组件的实现代码
2012/01/11 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
jQuery焦点图切换特效插件封装实例
2013/08/18 Javascript
jquery实现的美女拼图游戏实例
2015/05/04 Javascript
Jquery Ajax Error 调试错误的技巧
2015/11/20 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
Ionic3 UI组件之autocomplete详解
2017/06/08 Javascript
移动设备手势事件库Touch.js使用详解
2017/08/18 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
vue实现图片上传到后台
2020/06/29 Javascript
Python中使用SAX解析xml实例
2014/11/21 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
python Tkinter版学生管理系统
2019/02/20 Python
python 寻找离散序列极值点的方法
2019/07/10 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
Pytorch转tflite方式
2020/05/25 Python
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
澳大利亚墨尔本的在线时装店:LORETA
2018/09/14 全球购物
生物技术毕业生自荐信
2013/10/23 职场文书
会计电算化应届生自荐信
2014/02/25 职场文书
陈欧广告词
2014/03/14 职场文书
党员对照检查材料思想汇报(党的群众路线)
2014/09/24 职场文书
质量保证书怎么写
2015/02/27 职场文书