关于python中remove的一些坑小结

作者:Lipx9527 时间:2022-09-22 02:14:31 

前几天,使用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']

来源:https://www.cnblogs.com/lipx9527/p/9450819.html

标签:python,remove,坑
0
投稿

猜你喜欢

  • Python绘制散点密度图的三种方式详解

    2021-12-07 00:21:04
  • python中的编码和解码及\\x和\\u问题

    2023-11-02 14:46:31
  • python命令行参数解析OptionParser类用法实例

    2022-06-21 17:57:24
  • Python opencv应用实现图片切分操作示例

    2021-12-25 03:45:39
  • JS对象数组中如何匹配某个属性值

    2024-04-18 09:39:42
  • 在Python中利用pickle保存变量的实例

    2021-05-04 04:25:50
  • SQL Server Bulk Insert 只需要部分字段时的方法

    2011-10-24 19:44:49
  • 总结Python编程中函数的使用要点

    2021-03-15 01:49:52
  • 初学者快看,Python下划线的五个作用介绍

    2023-03-03 18:23:40
  • python语音识别指南终极版(有这一篇足矣)

    2021-09-15 23:57:21
  • Python进程间通信之共享内存详解

    2022-01-06 05:47:10
  • 在ASP.NET 2.0中操作数据之二十二:为删除数据添加客户端确认

    2024-05-09 09:03:54
  • 利用Python为iOS10生成图标和截屏

    2021-05-03 11:15:09
  • python 多进程并行编程 ProcessPoolExecutor的实现

    2023-10-23 14:41:56
  • python委派生成器的具体方法

    2022-06-14 01:23:39
  • Python利用百度地图获取两地距离(附demo)

    2022-10-18 23:21:33
  • Python实现图片添加文字

    2021-11-22 21:17:11
  • QQ在线客服网页代码大全

    2008-01-17 18:28:00
  • 利用SQL语言有没有办法查到表中哪些记录中的全部

    2009-04-10 18:29:00
  • 打包python 加icon 去掉cmd黑窗口方法

    2021-12-01 15:26:38
  • asp之家 网络编程 m.aspxhome.com