基于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 相关文章推荐
详解Python3.1版本带来的核心变化
Apr 07 Python
Python的Django框架使用入门指引
Apr 15 Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 Python
详解Python读取配置文件模块ConfigParser
May 11 Python
Windows下Anaconda的安装和简单使用方法
Jan 04 Python
对python:print打印时加u的含义详解
Dec 15 Python
python批量读取文件名并写入txt文件中
Sep 05 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
python实现多线程端口扫描
Aug 31 Python
python画蝴蝶曲线图的实例
Nov 21 Python
用Python的绘图库(matplotlib)绘制小波能量谱
Apr 17 Python
Python matplotlib多个子图绘制整合
Apr 13 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实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
PHP面向对象之后期静态绑定功能介绍
2015/05/18 PHP
详解php魔术方法(Magic methods)的使用方法
2016/02/14 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
javascript表单验证和Window详解
2014/12/11 Javascript
javascript获取四位数字或者字母的随机数
2015/01/09 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
javascript闭包功能与用法实例分析
2017/04/06 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
2019/11/12 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
python实现转圈打印矩阵
2019/03/02 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
python 简单的调用有道翻译
2020/11/25 Python
css3打造一款漂亮的卡哇伊按钮
2013/03/20 HTML / CSS
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
入党自我鉴定
2014/03/25 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
教师见习报告范文
2014/11/03 职场文书