关于python中remove的一些坑小结


Posted in Python onJanuary 04, 2021

前几天,使用python时遇到这么一个需求,删除一个列表中值为1的元素。我寻思着使用remove方法,但是remove方法只会删除第一个,于是我使用for循环去删除。代码和运行结果如下:

关于python中remove的一些坑小结

当时这个结果让我很懵逼,为什么1没有被删除完?查了资料发现,是for循环捣的鬼。因为for循环实际是循环的列表下标(索引),同时由于列表的可变性,每一次删除一个元素,列表的长度就会发生变化,元素的索引也会发生变化。这里来具体分析一下这段代码:

第一次循环,循环索引为0,此时索引为0的元素是1,满足条件,因此mylist中的第一个1被删除,此时mylist变为[1,2,1,1,3,4];

第二次循环,循环索引为1,此时新列表中,索引为1的元素是2,不满足条件,mylist仍然为[1,2,1,1,3,4];

第三次循环,循环索引为2,此时列表中,索引为2的元素是1,满足条件,remove方法会再次删除一个1,但是remove会删除第一次出现的1(即删除索引为0的那个1),因此列表变为[2,1,1,3,4];

第四次循环,循环索引为3,新列表中,索引为3的元素是3,不满足条件,mylist仍然为[2,1,1,3,4];

第五次循环,循环索引为4,此时列表中,索引为4的元素是4,不满足条件,mylist仍然为[2,1,1,3,4];

此时,由于新列表长度为5,于是循环结束。

下面的截图结果能够很直观的看出来。

关于python中remove的一些坑小结

至此,如果是这样的一段代码,结果应该是怎样?

关于python中remove的一些坑小结

最终mylist=['b','d'],怎么样,和你计算的值是否一样?

回到最初的需求,要怎样才能删除所有的1,这里可以使用deepcopy来复制一份,之后一个列表用于循环,一个用于移除值。代码和结果如下:

关于python中remove的一些坑小结

这样就可以实现删除列表中的所有值为1的元素。这里可能有人会问,为什么不直接将l1赋值给一个变量,即l2=l1,这里涉及到引用和深浅复制的问题,因此不在此处解答

附:Python列表的remove方法的注意事项

关于python中remove的一些坑小结

为何没有删除列表中的全部元素?

解释:

按照执行顺序,第一个空格被删除之后,后面的元素会前移(变成['空格','空格','12','23']),指针下一次会指向新列表的第二个元素(即初始状态的第三个空格),从而初始状态的第二个空格被跳过了,初始第三个空格被删除,接着后面的元素又再次前移(变成['空格','12','23']),指针指向新列表的第三个元素,即初始状态的第5个元素23,然后23被删除了,因此只剩下['空格','12']

如果想排除初始列表中的部分元素,如何实现?

由上面的情况知道,在遍历列表的同时对列表执行删除操作,会造成意外的结果,那么对初始列表进行遍历,对初始的列表的副本执行删除操作呢?

关于python中remove的一些坑小结

以上结果显示,没有得到预期效果。为什么?

问题出在copy=ls这一句,这里仅仅是使得copy与ls指向了同一片内存(即浅拷贝,shallow copy),并没有执行【开辟一片新内存,并且ls内存中的内容复制到新内存,然后使copy指向新开辟的内存,即深拷贝,deep copy】这一系列操作。因此对copy执行的remove操作,和对遍历ls列表,实质上还是都是针对同一片内存进行操作,因此结果上一个例子类似。

若想解决这一问题,有3个办法法:

(1)

ls=[' ',' ',' ','12','23','abc','aa']
copy=[' ',' ',' ','12','23','abc','aa']

 

这一办法对于已知列表的所有元素,且元素数量较少,结构较简单时可行,其他情况下不可行。

(2)引入copy模块的deepcopy方法:

关于python中remove的一些坑小结

(3)另外准备一个空列表,遍历初始列表时,将符合条件的元素逐一加入到空列表当中(利用列表的append方法)。

这种方法,思路上与remove方法相反,但执行的操作差不多,时间复杂度也与remove方法差不多,无需引入copy模块。

另外,对于列表的remove方法,python基础教程第二版给出的说明是:

remove方法用于移除列表中某个值的第一个匹配项:

>>>x=['to','be','or','not','to','be']

>>>x.remove('be')

>>>x

['to','or','not','to','be']

到此这篇关于python中remove的一些坑小结的文章就介绍到这了,更多相关python中remove的坑内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中的super用法详解
May 28 Python
Python中将字典转换为列表的方法
Sep 21 Python
利用Python中的pandas库对cdn日志进行分析详解
Mar 07 Python
Python实现树莓派WiFi断线自动重连的实例代码
Mar 16 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
Dec 28 Python
python实现flappy bird小游戏
Dec 24 Python
python+tkinter实现学生管理系统
Aug 20 Python
关于python导入模块import与常见的模块详解
Aug 28 Python
Django多层嵌套ManyToMany字段ORM操作详解
May 19 Python
Python中免验证跳转到内容页的实例代码
Oct 23 Python
Python基础知识学习之类的继承
May 31 Python
python自动化八大定位元素讲解
Jul 09 Python
python中remove函数的踩坑记录
Jan 04 #Python
python 日志模块logging的使用场景及示例
Jan 04 #Python
python 邮件检测工具mmpi的使用
Jan 04 #Python
Python3中的tuple函数知识点讲解
Jan 03 #Python
python中pivot()函数基础知识点
Jan 03 #Python
python regex库实例用法总结
Jan 03 #Python
Python爬虫之Selenium库的使用方法
Jan 03 #Python
You might like
PHP分页显示制作详细讲解
2008/11/19 PHP
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
PHP插入排序实现代码
2013/04/04 PHP
CodeIgniter多语言实现方法详解
2016/01/20 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
Javascript typeof 用法
2008/12/28 Javascript
jquery 锁定弹出层实现代码
2010/02/23 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
jQuery的remove()方法使用详解
2015/08/11 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
jQuery 局部div刷新和全局刷新方法总结
2016/10/05 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
JavaScript中的事件与异常捕获详析
2019/02/24 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
vue配置文件实现代理v2版本的方法
2019/06/21 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
Python程序员开发中常犯的10个错误
2014/07/07 Python
Python实现k-means算法
2018/02/23 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
Foreo国际站:Foreo International
2018/10/29 全球购物
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
医院志愿者活动总结
2015/05/06 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
浅谈redis缓存在项目中的使用
2021/05/20 Redis