python 学习笔记:for 循环删除元素的坑

虽然网上很多这样的文章,但是还是要再写一遍,加深自己的印象。

今天在刷 LeetCode 的时候,有一道很简单的题目:

移除元素

给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

这样一看,很简单,for 判断一下再删除就好了。于是第一版代码提交上去

for i in nums:
	if i == val:
		nums.remove(i)

结果发现最后一个元素没有被删除掉。于是百度之,理解了一下 for 删除的操作。

python 中用 for 发起任何形式的遍历时,它的遍历顺序都是从最初就确定的,而在遍历中删除了元素会导致当前索引的变化,所以遍历中间取到的索引的那个值已经变了,会漏掉一些元素。另一种错误是删除元素后列表长度缩小了,所以会超出索引范围。

原数组为 [1,2,2,0,2],假设要删除所有的 2 元素
第一次执行 nums.remove(i) ,元素一不相等不执行操作,数组为 [1,2,2,0,2]
第二次执行 nums.remove(i) ,元素二相等,删除,数组为 [1,2,0,2]
第三次执行 nums.remove(i) ,元素三相等,删除,数组为 [1,0,2]
第四次执行 nums.remove(i) ,没有元素四
第五次执行 nums.remove(i) ,没有元素五

如果要完成这道题目的话,可以采用倒序删除的方式

for i in nums[::-1]:
	if i == val:
		nums.remove(i)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值