关于python中remove的一些坑小结

 更新时间:2021年01月04日 10:02:23   作者:Lipx9527  
这篇文章主要给大家介绍了关于python中remove的一些坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

当时这个结果让我很懵逼,为什么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,于是循环结束。

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

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

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

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

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

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

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

解释:

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

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

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


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

问题出在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方法:

(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 selenium webdriver 基本使用代码分享

    Python selenium webdriver 基本使用代码分享

    这篇文章主要介绍了Python selenium webdriver 基本使用,本文仅仅简单介绍了selenium的使用常用代码分享,需要的朋友可以参考下
    2022-11-11
  • Python实现查询剪贴板自动匹配信息的思路详解

    Python实现查询剪贴板自动匹配信息的思路详解

    这篇文章主要介绍了Python实现查询剪贴板自动匹配信息,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • Python快速查找list中相同部分的方法

    Python快速查找list中相同部分的方法

    今天小编就为大家分享一篇Python快速查找list中相同部分的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Python之os模块案例详解

    Python之os模块案例详解

    这篇文章主要介绍了Python之os模块案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Python深度学习实战PyQt5安装与环境配置过程详解

    Python深度学习实战PyQt5安装与环境配置过程详解

    本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战。什么叫从零开始?从软件安装、环境配置开始。不跳过一个细节,不漏掉一行代码,不省略一个例图
    2021-10-10
  • DjangoRestFramework 使用 simpleJWT 登陆认证完整记录

    DjangoRestFramework 使用 simpleJWT 登陆认证完整记录

    Djangorestframework-simplejwt是Django REST Framework框架的一个jwt插件,使用 python http 工具进行接口测试的方法文中给大家提到,重点给大家分享djangorestframework-simplejwt 使用记录及登陆认证的完成过程,感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • Python用requests-html爬取网页的实现

    Python用requests-html爬取网页的实现

    本文主要介绍了Python用requests-html爬取网页的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Python爬虫爬取Bilibili弹幕过程解析

    Python爬虫爬取Bilibili弹幕过程解析

    这篇文章主要介绍了Python爬虫爬取Bilibili弹幕过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 对python中矩阵相加函数sum()的使用详解

    对python中矩阵相加函数sum()的使用详解

    今天小编就为大家分享一篇对python中矩阵相加函数sum()的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python文件编写好后如何实践

    python文件编写好后如何实践

    在本篇文章里小编给大家分享了关于python文件编写好后如何实践的相关内容,需要的朋友们可以参考下。
    2020-07-07

最新评论