码迷,mamicode.com
首页 > 编程语言 > 详细

Python 在列表循环中的一些坑

时间:2019-12-24 11:54:07      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:cal   原因   问题   ast   现在   mod   col   tps   star   

循环内用 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

Python 在列表循环中的一些坑

标签:cal   原因   问题   ast   现在   mod   col   tps   star   

原文地址:https://www.cnblogs.com/luodaxia/p/12090312.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!