• 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 赋值呗。 

  • 相关阅读:
    禁用Firefox浏览器中的CSS、Flash及Image加载
    禁用Chrome浏览器中的Image加载
    启用Firefox的同时打开Firebug
    禁用IE的保护模式
    禁用Chrome浏览器的PDF和Flash插件
    屏蔽Chrome的--ignore-certificate-errors提示及禁用扩展插件并实现窗口最大化
    技术文档
    操作工具
    接口自动化
    nmon
  • 原文地址:https://www.cnblogs.com/CharmCode/p/8047900.html
Copyright © 2020-2023  润新知