python循环删除列表元素常见错误与正确方法
常见错误一:使用固定长度循环删除列表元素
l = ['a','b','c'] for i in range(len(l)): l.pop(i)
报错:
ValueError: list.remove(x): x not in list
原因:
在删除list中的元素后,list的实际长度变小了,但是循环次数没有减少,依然按照原来list的长度进行遍历,所以会造成索引溢出。是的,i的值是一开始就生成好了(0,1,2),后面不会因为列表大小变化了再变化。
图示:
执行第一次pop前,i是0
执行第一次pop后,删除了索引0原来的a
执行第二次pop前,i是1
执行第二次pop后,删除了索引1原来的c
执行第三次pop前,i是2。继续执行pop,索引2已超出了列表范围(此时列表只有索引0了)。
解决方法:倒序循环遍历
l = ['a','b','c'] for i in range(len(l)-1, -1, -1): l.pop(i)
常见错误二:正序循环遍历删除列表元素
l = ['a','b','c'] for i in l: l.remove(i) print l
结果:
['b']
原因:
按顺序循环删除,怎么会有一个没删除呢?原因同上,i的值是一开始就生成好了(0,1,2),后面不会因为列表大小变化了再变化。但是列表因为值的删除,是在变化的。
图示:
执行第一次remove前,i是索引0的a
执行第一次remove后,i是索引0的a被删除
执行第二次remove前,i是索引1的c
执行第二次remove后,i是索引1的c被删除。之后继续执行i是索引2,此时列表已经没有索引2了,循环退出。最后b就被剩下了。
解决方法一:倒序循环遍历:
l = ['a','b','c'] for i in l[::-1]: l.remove(i) print l
解决方法二:深拷贝一个ll,对l遍历,对ll操作
l = ['a','b','c'] ll = l[:] for i in l: ll.remove(i)
此方法的缺点是对于过大的list,拷贝后可能很占内存。那么对于这种情况,可以用倒序遍历的方法来实现。
---------------------------------------------------------------------------------
关注微信公众号(测试工程师小站)即可在手机上查阅,并可接收更多测试分享,发送【测试资料】更可获取百G测试教程~
原文地址:https://www.cnblogs.com/songzhenhua/p/12993189.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一天一大 lee(被围绕的区域)难度:中等-Day20200811
- 一天一大 leet(搜索插入位置)难度:简单-Day20200717
- 一天一大 leet(两数之和 II - 输入有序数组)难度:简单-Day20200720
- 一天一大 leet(分割数组的最大值)难度:困难-Day20200725
- 一天一大 leet(矩阵中的最长递增路径)难度:困难-Day20200726
- 一天一大 lee(克隆图)难度:中等-Day20200812
- 一天一大 lee(有效的括号)难度:简单-Day20200814
- 一天一大 leet(判断子序列)难度:简单-Day20200727
- 一天一大 leet(寻宝)难度:困难-Day20200729
- LeetCode刷题记录(easy难度21-40题)
- 一天一大 lee(移除盒子)难度:困难-Day20200815
- LeetCode刷题记录(easy难度1-20题)
- 改变 Python 中线程执行顺序的方法
- 一天一大 leet(整数拆分)难度:中等-Day20200730
- iOS客户端启动速度优化实践