IndexError:列表索引超出“如果...否则...”

时间:2019-07-04 00:28:09

标签: python python-3.x python-3.7

我在leetcode中练习了“从排序数组中删除重复项”的测试。一切都很好,但是当我测试input [1,1]时,它失败了:

IndexError: list index out of range

我可以知道为什么吗?(​​我已经有了正确的解决方案,但是我仍然想知道这个错误。)

这是我的代码:

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        index_o=0
        i=1
        while i <len(nums):   
              if nums[index_o]==nums[i]:
                  nums.remove(nums[i])
                  index_o-=1
                  i-=1
                  print("nums[index_o]:",nums[index_o])
                  print("index_o:",index_o)
                  print("nums[i]:",nums[i])
                  print("i:",i)
                  print("nums:",nums)
              else:
                  index_o+=1
                  i+=1
        return len(nums)

n=[1,1]
a=Solution()
print(a.removeDuplicates(n))
print(n)

结果如下:

f:leetcode>python 190626.py
nums[index_o]: 1
index_o: -1
nums[i]: 1
i: 0
nums: [1]
Traceback (most recent call last):
  File "190626.py", line 228, in <module>
    print(a.removeDuplicates(n))
  File "190626.py", line 217, in removeDuplicates
    print("nums[index_o]:",nums[index_o])
IndexError: list index out of range

这是正确的解决方案:

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        index_o=0
        i=1
        while i <len(nums): 
              if nums[index_o]==nums[i]:
                  nums.remove(nums[index_o])
              else:
                  index_o+=1
                  i+=1
        return len(nums)

2 个答案:

答案 0 :(得分:1)

在循环的第三次迭代中,您拥有变量i=-1和n = []。您的代码输入到第一个if,因为-1 < 0等于True。*

这时,您尝试使用变量index_o(即-2)访问数组。由于您的数组为空,因此n [-2]返回IndexError: list index out of range错误。

您对代码的一些评论:
 -该算法未达到预期的效果,但我可以理解您的想法。
 -为什么删除重复项功能会返回输出数组的长度,而不是返回数组本身的长度?
 -要测试该算法,可以使用内置的set(),它将从数组中删除重复项。然后可以比较它们。
 -在开发算法时,请始终按照@ Mark-meyer在注释中的建议通过打印值来使用调试。

*我没有在本地运行算法并进行调试,只是从头开始跟踪它。因此,某些值可能会相差一。

答案 1 :(得分:0)

当第一次到达执行while循环并且if的语句为true时,变量index_o的值为-1,变量{{1} }将为0,i循环将再次以while的身份运行。因此,下一次,i=0 < len(nums)=1语句将检查没有索引的if。我建议您添加一个if nums[-1] == nums[0]语句,以确保您的数组指针不会得到负值。