专栏首页葫芦python list.remove的坑

python list.remove的坑

python中使用list的时候,通常需要用到移除其中某些元素,而remove函数就正好可以移除元素,所以就会想到循环遍历list,利用remove函数移除元素,例如下面一段代码:

>>> cl=[15, 14, 13, 12, 11, 10, 9, 8, 3008, 3007, 3010, 3009, 3012, 3011, 3014, 3013, 7, 1015, 2011, 2012, 2009, 2010, 2015, 2013, 2014, 2008, 1014, 1011, 1012, 1005, 1006, 1007, 1008, 1009, 1010, 1013, 3015]
>>> flu=[1002, 1003, 1005, 1006, 1008, 1009, 1011, 1013, 1015, 3003, 3006, 3008, 3010, 3013, 3014, 3015, 3011, 10, 12, 14, 15, 2003, 2005, 2008, 2010, 2013, 2015, 2006, 4901, 1001, 1004, 1007, 1010, 1012, 1014, 3001, 3002, 3004, 3007, 3009, 3012, 6, 7, 8, 9, 11, 13, 2001, 2002, 2004, 2007, 2009, 2011, 2012, 2014, 4001]

>>> for i in flu:
...     if i in cl:
...         print i
...         flu.remove(i)
...
1005
1008
1011
1015
3008
3013
3015
10
14
2008
2013
1007
1012
3007
3012
7
9
13
2009
2012
>>> flu
[1002, 1003, 1006, 1009, 1013, 3003, 3006, 3010, 3014, 3011, 12, 15, 2003, 2005, 2010, 2015, 2006, 4901, 1001, 1004, 1010, 1014, 3001, 3002, 3004, 3009, 6, 8, 11, 2001, 2002, 2004, 2007, 2011, 2014, 4001]

上面的一段代码期望实现的是删除list中等于8的元素,运行结果为:

删除之后仍然还有元素8,并没有完全删除,所以这种方法是有问题的,那么问题在哪呢?

那是因为list的遍历是基于下标的,当你删除其中的一个元素的时候,列表实际上已经发生了变化,该元素后面的所有元素都往前移动了一个位置,所以下次遍历的时候就会跳过该元素后面的一个元素。

解决方法:

从flu列表中删除cl列表中包含的元素。

>>> list(set(flu).difference(set(cl)))
[4001, 4901, 6, 1001, 1002, 1003, 1004, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 3001, 3002, 3003, 3004, 3006]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • linux ctrl键组合

    葫芦
  • cssjshtml vue.js利用计算属性、指令开发购物车

    葫芦
  • linux 输入输出重定向

    葫芦
  • elasticsearch了解及使用

    ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsear...

    sucl
  • 循环、递归与魔术(二)——循环的魔术逻辑浅析与欣赏

    在上一篇中,我们讲了循环和递归的数学和计算机概念,并举例说明其是一种在生活中的无处不在的结构。相关回顾:

    magic2728
  • 3个CCIE出的面试题

    1. 现在的6509及7609,SUP720交换带宽去到720G,是不是可以说7609/6509可以取代一部分GSR的地位?   2. isis level1...

    py3study
  • java进阶|LinkedList源码解析和理解

    额,本来打算分析队列queue的源码,结果linkedList链表结构没有去分析,导致这里不得不分析linkedList源码了,由于LinkedLi...

    后端Coder
  • 渗透测试安全检测漏洞

    最近渗透测试工作比较多没有空闲的时间来写文章,今天由我们Sine安全的渗透主管来普及一下java的安全测试基础,很多客户想要了解具体js的调用漏洞或提交play...

    技术分享达人
  • 渗透测试安全检测漏洞

    最近渗透测试工作比较多没有空闲的时间来写文章,今天由我们Sine安全的渗透主管来普及一下java的安全测试基础,很多客户想要了解具体js的调用漏洞或提交play...

    网站安全专家
  • 简单密码学总结1.0

    摩尔斯电码由两种基本信号组成:短促的点信号“·”,读“滴”;保持一定时间的长信号“—”,读“嗒”。间隔时间:滴=1t,嗒=3t,滴嗒间=1t,字符...

    天钧

扫码关注云+社区

领取腾讯云代金券