python剔除列表异常值_python循环删除列表元素常见错误与正确方法

常见错误一:使用固定长度循环删除列表元素

l = ['a','b','c']for i inrange(len(l)):

l.pop(i)

报错:

ValueError: list.remove(x): x not in list

原因:

在删除list中的元素后,list的实际长度变小了,但是循环次数没有减少,依然按照原来list的长度进行遍历,所以会造成索引溢出。是的,i的值是一开始就生成好了(0,1,2),后面不会因为列表大小变化了再变化。

图示:

执行第一次pop前,i是0

1441963-20200530160857596-1071791372.png

执行第一次pop后,删除了索引0原来的a

1441963-20200530160903848-1245418756.png

执行第二次pop前,i是1

1441963-20200530161015790-798247965.png

执行第二次pop后,删除了索引1原来的c

1441963-20200530161024972-1209918842.png

执行第三次pop前,i是2。继续执行pop,索引2已超出了列表范围(此时列表只有索引0了)。

1441963-20200530161035089-1532463462.png

解决方法:倒序循环遍历

l = ['a','b','c']for i in range(len(l)-1, -1, -1):

l.pop(i)

常见错误二:正序循环遍历删除列表元素

l = ['a','b','c']for i inl:

l.remove(i)print l

结果:

['b']

原因:

按顺序循环删除,怎么会有一个没删除呢?原因同上,i的值是一开始就生成好了(0,1,2),后面不会因为列表大小变化了再变化。但是列表因为值的删除,是在变化的。

图示:

执行第一次remove前,i是索引0的a

1441963-20200530161054561-86153175.png

执行第一次remove后,i是索引0的a被删除

1441963-20200530161102310-8880459.png

执行第二次remove前,i是索引1的c

1441963-20200530161115735-1747633588.png

执行第二次remove后,i是索引1的c被删除。之后继续执行i是索引2,此时列表已经没有索引2了,循环退出。最后b就被剩下了。

1441963-20200530161126175-28264041.png

解决方法一:倒序循环遍历:

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 inl:

ll.remove(i)

此方法的缺点是对于过大的list,拷贝后可能很占内存。那么对于这种情况,可以用倒序遍历的方法来实现。

---------------------------------------------------------------------------------

关注微信公众号(测试工程师小站)即可在手机上查阅,并可接收更多测试分享,发送【测试资料】更可获取百G测试教程~

1441963-20200419182634999-600106893.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值