Python循环删除中遇到的小坑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python循环删除中遇到的小坑相关的知识,希望对你有一定的参考价值。

这是我学python的时候印象最深的小坑

  • 需求有一个列表要删掉==‘b‘的这个字符

 1 In [1]: l = [‘a‘, ‘b‘, ‘b‘, ‘c‘, ‘b‘, ‘d‘, ‘b‘, ‘b‘]
 2 
 3 In [2]: l
 4 Out[2]: [‘a‘, ‘b‘, ‘b‘, ‘c‘, ‘b‘, ‘d‘, ‘b‘, ‘b‘]
 5 
 6 In [3]: for i in l:
 7    ...:     if i == ‘b‘:
 8    ...:         l.remove(i)
 9    ...:         
10 
11 In [4]: l
12 Out[4]: [‘a‘, ‘c‘, ‘d‘, ‘b‘, ‘b‘]

      然后我通过最常规的方法一个for循环去删除,但是结果还是没有把全部为‘b‘的元素给删除,这是为什么??

      其实这个问题很好理解,就是当你顺序删除第一符合条件的元素的时候,然后此时当前元素的位置就会空出,

后面的元素会填充那个被删除元素的坑位,从而逃过一劫。那么有什么解决办法了?

      既然知道问题所在,那我们就不顺序删除,从后面往前面删除,或者换个思路。

1,方法一:我们就用倒叙删除的方式

 1 In [15]: l = [‘a‘, ‘b‘, ‘b‘, ‘c‘, ‘b‘, ‘d‘, ‘b‘, ‘b‘]
 2     ...: 
 3 
 4 In [16]: for i in range(len(l)-1, -1, -1):
 5     ...:     if l[i] == ‘b‘:
 6     ...:         l.remove(l[i])
 7     ...:         
 8 
 9 In [17]: l
10 Out[17]: [‘a‘, ‘c‘, ‘d‘]

这样我们从后面往前面删除,元素就不会自动填坑,就避免了那个小坑了

 1 In [14]: list(range(len(l)-1, -1, -1))

2 Out[14]: [7, 6, 5, 4, 3, 2, 1, 0] 

这行代码是用来获取倒叙的下角标方便排序的

2,方法二:我们换个思路不用删除的方式,我们用添加的方式去删除.

 1 In [18]: l = [‘a‘, ‘b‘, ‘b‘, ‘c‘, ‘b‘, ‘d‘, ‘b‘, ‘b‘]
 2     ...: 
 3 
 4 In [19]: n = []
 5 
 6 In [20]: for i in l:
 7     ...:     if i != ‘b‘:
 8     ...:         n.append(i)
 9     ...:         
10 
11 In [21]: n
12 Out[21]: [‘a‘, ‘c‘, ‘d‘]

我们新建一个空列表,然后再把判断条件取反的都添加到新列表里面

这样就达到了删除==‘b‘元素的目的,写到这可能就有人会说你这明明是新变量

1 In [22]: l = n
2 
3 In [23]: l
4 Out[23]: [‘a‘, ‘c‘, ‘d‘]

很简单,重新给 l 赋值呗。

 

 

这是我写的第一条博客:路漫漫其修远兮 吾将上下而求索

我的github主页   https://github.com/wgPython

欢迎各位大佬技术交流,分享.

以上是关于Python循环删除中遇到的小坑的主要内容,如果未能解决你的问题,请参考以下文章

React事件中遇到的一个小坑

7个Python小坑,给新手党的福利

常用python日期日志获取内容循环的代码片段

循环通过 python 正则表达式匹配

坑python新建二维列表的一个小坑

今天写测试代码时遇到的小坑