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