基于Python中Remove函数的用法讨论


Posted in Python onDecember 11, 2020

前几天在进行写程序时碰到这样一个问题

a=['a','b','c','d']

b=['c','d','e','f']

需要将数组a中元素,在数组b中出现过都删除。第一次写出程序如下:

a=['a','b','c','d']
b=['c','d','e','f']
for x in a:
 if x in b:
 a.remove(x)
print (a)

最后的输出结果为

基于Python中Remove函数的用法讨论

出现这样的结果,当时感觉很诧异。但立马细细一想,立马明白了其中的原因。

当x='c'时,此时满足if条件语句,执行if下的语句:a.remove(x),也就是将'c'元素从a数组中删除。

删除之后,remove函数并没有执行结束。而是将a数组中索引号大于删除元素索引号的所有元素依次前一位。

此时,x指向a[2],a数组当前的状态为:['a','b','d'],a[2]中存储的为元素'd'。

remove函数返回后,继续执行for循环,x指向数组的下一个索引。

因此导致了'd'元素没有与数组b进行比较。

后续,将程序进行了如下修改:

a=['a','b','c','d']
c=['a','b','c','d']
b=['c','d','e','f']
 
for x in a:
 if x in b:
 c.remove(x)
print (c)

程序运行结果如下:

基于Python中Remove函数的用法讨论

虽然问题不是很难,但是这个细节问题一定要把握。

补充知识: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函数的用法讨论

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 相关文章推荐
python基于xmlrpc实现二进制文件传输的方法
Jun 02 Python
Python实现以时间换空间的缓存替换算法
Feb 19 Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 Python
python SMTP实现发送带附件电子邮件
May 22 Python
在PyCharm中实现关闭一个死循环程序的方法
Nov 29 Python
python实现电子书翻页小程序
Jul 23 Python
python+tifffile之tiff文件读写方式
Jan 13 Python
Python3的socket使用方法详解
Feb 18 Python
python能开发游戏吗
Jun 11 Python
matplotlib图例legend语法及设置的方法
Jul 28 Python
浅谈pytorch中的dropout的概率p
May 27 Python
pyqt5蒙版遮罩mask,setmask的使用
Jun 11 Python
在 Python 中使用 7zip 备份文件的操作
Dec 11 #Python
Python文件名匹配与文件复制的实现
Dec 11 #Python
Python: glob匹配文件的操作
Dec 11 #Python
Python Socket多线程并发原理及实现
Dec 11 #Python
python 实现Harris角点检测算法
Dec 11 #Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 #Python
Python3 用matplotlib绘制sigmoid函数的案例
Dec 11 #Python
You might like
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
php设置session值和cookies的学习示例
2014/03/21 PHP
PHP合并静态文件详解
2014/11/14 PHP
php操作xml入门之cdata区段
2015/01/23 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
var与Javascript变量隐式声明
2009/09/17 Javascript
根据对象的某一属性进行排序的js代码(如:name,age)
2010/08/10 Javascript
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
jQuery调用ajax请求的常见方法汇总
2015/03/24 Javascript
详解maxlength属性在textarea里奇怪的表现
2015/12/27 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
对python中return和print的一些理解
2017/08/18 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
python定时关机小脚本
2018/06/20 Python
python实现换位加密算法的示例
2018/10/14 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
对python tkinter窗口弹出置顶的方法详解
2019/06/14 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
Python pandas实现excel工作表合并功能详解
2019/08/29 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
质检的岗位职责
2013/11/17 职场文书
六查六看自查报告
2014/10/14 职场文书
计划生育个人总结
2015/03/02 职场文书
小时代观后感
2015/06/10 职场文书
react中props 的使用及进行限制的方法
2021/04/28 Javascript
windows server2008 开启端口的实现方法
2022/06/25 Servers