关于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获取豆瓣电影简介代码分享
Jan 16 Python
Python守护进程(daemon)代码实例
Mar 06 Python
Python爬虫:通过关键字爬取百度图片
Feb 17 Python
如何用Python实现简单的Markdown转换器
Jul 16 Python
Python中分支语句与循环语句实例详解
Sep 13 Python
对python多线程中Lock()与RLock()锁详解
Jan 11 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
May 29 Python
对django 模型 unique together的示例讲解
Aug 06 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
Aug 31 Python
python实现将字符串中的数字提取出来然后求和
Apr 02 Python
Python -m参数原理及使用方法解析
Aug 21 Python
pycharm远程连接服务器并配置python interpreter的方法
Dec 23 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
解析coreseek for sphinx的使用
2013/06/21 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
分析python服务器拒绝服务攻击代码
2014/01/16 Python
Python实现身份证号码解析
2015/09/01 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
pyspark给dataframe增加新的一列的实现示例
2020/04/24 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
银行实习人员自我鉴定
2013/09/22 职场文书
优良学风班总结材料
2014/02/08 职场文书
迎元旦广播稿
2014/02/22 职场文书
医学求职信
2014/05/28 职场文书
五五普法心得体会
2014/09/04 职场文书
工资收入证明
2014/10/07 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
讲座通知范文
2015/04/23 职场文书
董事长秘书工作总结
2015/08/14 职场文书
课改心得体会范文
2016/01/25 职场文书