关于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中urllib2模块的8个使用细节分享
Jan 01 Python
Python 模拟登陆的两种实现方法
Aug 10 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
python 定义给定初值或长度的list方法
Jun 23 Python
Python wxPython库Core组件BoxSizer用法示例
Sep 03 Python
python 实现数字字符串左侧补零的方法
Dec 04 Python
对Python+opencv将图片生成视频的实例详解
Jan 08 Python
django认证系统实现自定义权限管理的方法
Aug 28 Python
Matlab如何实现矩阵复制扩充
Jun 02 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 heredoc和phpwind的模板技术使用方法小结
2008/03/28 PHP
zend api扩展的php对象的autoload工具
2011/04/18 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
javascript 框架小结 个人工作经验
2009/06/13 Javascript
javascript getElementsByName()的用法说明
2009/07/31 Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
浅谈JQ中mouseover和mouseenter的区别
2016/09/13 Javascript
webpack+vue.js实现组件化详解
2016/10/12 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
基于jQuery封装的分页组件
2017/06/26 jQuery
Angularjs按需查询实例代码
2017/10/30 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
js实现简单的打印表格
2020/01/15 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
Python实现远程调用MetaSploit的方法
2014/08/22 Python
python开发中module模块用法实例分析
2015/11/12 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
anaconda3安装及jupyter环境配置全教程
2020/08/24 Python
this关键字的含义
2015/04/08 面试题
本科生求职简历的自我评价
2013/10/21 职场文书
《在大海中永生》教学反思
2014/02/24 职场文书
班主任经验交流会主持词
2014/04/01 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
焦点访谈观后感
2015/06/11 职场文书