改造之前一个数据处理代码,需要在循环中根据判断条件来决定是否移除当前的循环体对象。
简单示例代码:
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8] >>> for x in lst: if x < 6: lst.remove(x) >>> lst [2, 4, 6, 7, 8]
这个示例中返回结果有错误,即本意是要移除x<6的对象,但最终并没有完全移除,造成了隔一个移除的结果。造成错误结果的主要原因是循环体在循环过程中并不知道循环体发生了变化,导致循环体在定位到下一个循环体对象时发生了位移。其解决方案也比较简单:
1、拷贝一个循环体,使用拷贝后的循环体进行循环,而修改则在原来的循环体,这样就互不影响。
2、对循环体使用reversed()函数,即:
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8] >>> for x in reversed(lst): if x < 6: lst.remove(x) >>> lst [6, 7, 8]
参考:
https://sopython.com/canon/95/removing-items-from-a-list-while-iterating-over-the-list/
发表回复