python list.remove的坑

葫芦的运维日志

下一篇 搜索 上一篇

2017/11/23 21:07


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]

 

葫芦的运维日志

打赏

上一篇 搜索 下一篇
© 冰糖葫芦甜(bthlt.com) 2019 王梓 打赏联系方式 陕ICP备17005322号