概述
大家好
今天我想考虑一下关于遍历的问题
话不多说, 代码先上
尝试原地删掉重复数字:
‘’’
def removeDuplicates(nums):
for i in range(len(nums)-1):
if nums[i]==nums[i+1]:
nums.pop(i+1)
return nums
print(removeDuplicates([1,1,2]))
‘’’
我个笨蛋之前一直找不到问题在哪里
因为我在列表中做了动态的变化,我遍历的是之前列表的总长度-1 , 在pop的第一次长度就已在变,所以会超出范围~~`
其实不然, for的时候lens(nums)早就变化了。
~~删除线格式~~
让我来取个例子: 【1,1,2】
先按照错误代码走一遍:
i in 0-1:
如果num【0】==num[1];
num.pop(1)
这时长度为2,进行下一步遍历:(现在列表【1,2】)
如果num[1】==num[2] , 等一下 没有索引2 了~~
前面这是错误的~~ 思考过程,如果有大佬可以瞅瞅,新手别看了,我怕带坏你。。
#有的人强调说不要在迭代列表时更改列表(来自segmentfault)
这篇启发来自思否, 请别说我抄袭例子。
上面的例子:
L = [1, 2, 3, 4, 4, 5]
for i, value in enumerate(L):
if value == 4:
L.pop(i)
这里有个bug,当你在i==3时,第一个4删掉,但length为5不为六,pop(๑′ᴗ‵๑) 完之后第二个4的索引为3了,但遍历继续往前不再管第二个4,直接跳i==4也就是数字5.
可以看出当你迭代是做出改变列表的指示,其索引也在做改变,例如[1, 4, 2, 3, 4, 5],len为6。当1的4被删掉,但这是的列表就位【1,2,3,4,5】,len为5。
这里可以发现pop 和迭代不可连用 容易产生漏洞??(我不是很确定)
反正在迭代中用pop时,i并没有改变,还是按照原来的走,但是上线改变了?所以导致并没溢出错误报出。就根据这个第二个4没有变来判定的。(参考来自debugmyself)
接下来我要换一种方法了,上面给我了一次教训?(如果有大佬可以用这两个结合的,麻烦教教我)。
但是逆遍历可以使用pop(参照knife-)
def removeDuplicates(nums):
for i in range(len(nums)-1,0,-1):
if nums[i]==nums[i-1]:
nums.pop(i)
return nums
print(removeDuplicates([1,2,3,4,4,5]))~
‘’-----------------------‘’
https://segmentfault.com/q/1010000010073774
最后
以上就是体贴月亮为你收集整理的新手菜鸟刷力扣之关于遍历的全部内容,希望文章能够帮你解决新手菜鸟刷力扣之关于遍历所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复