这是我学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
欢迎各位大佬技术交流,分享.