新手菜鸟刷力扣之关于遍历

大家好
今天我想考虑一下关于遍历的问题
话不多说, 代码先上
尝试原地删掉重复数字:
‘’’
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

你可能感兴趣的:(新手菜鸟刷力扣之关于遍历)