zoukankan      html  css  js  c++  java
  • Python 在列表循环中的一些坑

    循环内用 remove 删除列表自身元素

    问题

    在 for i in list 循环中,如果在循环内部使用 list 的 remove 方法删除多个相邻的数据时,会出现漏删和输出信息错误; 当删除一个数据时,会出现输出信息错误。

    例如:

    # 创建一个 L list
    # 删除相邻的多个数据
    In [12]: L = [11, 22, 33, 44, 55, 66, 77]
    In [13]: for i in L:
    ...: if i == 22 or i == 33:
    ...: L.remove(i)
    ...: print(i)
    ...: 
    # 想想这里 print 会打印出什么内容以及现在 L 的内容 
    11
    22
    44
    55
    66
    77
    # 输出了本应该被删除的 22 
    In [14]: L
    # L 中本应该被删除的 33 没有被删除,
    Out[14]: [11, 33, 44, 55, 66, 77]
    # 如果你在一次性删除更多的数据或者全部整个列表用循环删除
    # 会发现一个规律,remove 会隔一个数据删一个
    In [20]: L = [11, 22, 33, 44, 55, 66, 77, 88]
    
    In [21]: for i in L:
    ...: L.remove(i)
    ...:
    
    In [22]: L
    Out[22]: [22, 44, 66, 88]
    # 创建一个 L list
    # 删除单个数据
    In [15]: L = [11, 22, 33, 44, 55, 66, 77]
    
    In [16]: for i in L:
    ...: print(i)
    ...: if i == 33:
    ...: L.remove(i)
    ...: 
    11
    22
    33
    55
    66
    77
    # 输出了本应该被删除的 33 而本没有被删除的 44 却没有打印出来
    In [17]: L
    Out[17]: [11, 22, 44, 55, 66, 77]

    原因

    存在一个指针

    在删除多个数据时,当删除第一项数据时后面的数据会往前移,使得指针指向删除的数据后面的一项

    然后在删除下一个时会跳过前一个被删除数据的下一项

    解决

    可以将需要删除的项取出来单独删除

    通过 range 来删除列表中数据

    问题

    在通过 len(list) 和 range 函数通过 for 循环来删除列表元素时,会出现报错

    In [26]: L = [11, 22, 33, 44, 55, 66, 77, 88]
    
    In [27]: for i in range(len(L)):
    ...: if L[i] == 33:
    ...: del L[i]
    ...: 
    ---------------------------------------------------------------------------
    IndexError Traceback (most recent call last)
    <ipython-input-27-ced9d7033028> in <module>()
    1 for i in range(len(L)):
    ----> 2 if L[i] == 33:
    3 del L[i]
    4
    
    IndexError: list index out of range
    # 上面提示超出索引范围

    原因

    原因当在循环中删除数据,然而 range 不会变,所以超出索引

    解决

    In [28]: L = [11, 22, 33, 44, 55, 66, 77, 88]
    
    In [29]: for i in range(len(L)-1,-1,-1):
    ...: if L[i] == 33:
    ...: del L[i]
    ...:
    
    In [30]: L
    Out[30]: [11, 22, 44, 55, 66, 77, 88]
    
    range(start, end, step) ====> start->开始 end->结束 step->步长
    
    range(len(L)-1, -1, -1) ====> 从最后一个元素开始遍历


    转自:https://blog.csdn.net/weixin_42513315/article/details/81912629

  • 相关阅读:
    UIVIew详解
    UIView对象转成UIImage对象
    OC 获取IOS屏幕尺寸大小
    presentModalViewController和dismissModalViewControllerAnimated的替代方法
    设计模式之观察者模式(关于OC中的KVO(Observer)KVCNSNotification)
    Key-Value Observing机制
    iOS对象序列化与反序列化( NScoder 和 NScoding )
    IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic、@synthesize、@property、@dynamic
    UIImage 缩放
    CentOS6.8下二进制安装mysql5.7
  • 原文地址:https://www.cnblogs.com/luodaxia/p/12090312.html
Copyright © 2011-2022 走看看