Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 索引器:在“索引”中列出索引超出范围;如果。。。否则……”;_Python_Python 3.x_Python 3.7 - Fatal编程技术网

Python 索引器:在“索引”中列出索引超出范围;如果。。。否则……”;

Python 索引器:在“索引”中列出索引超出范围;如果。。。否则……”;,python,python-3.x,python-3.7,Python,Python 3.x,Python 3.7,我在leetcode中练习了“从排序数组中删除重复项”的测试。一切正常,但当我测试输入[1,1]时,它失败了,原因是: IndexError: list index out of range 我可以知道为什么吗?(我已经得到了一个正确的解决方案,但我仍然怀疑这个错误。) 这是我的密码: class Solution(object): def removeDuplicates(self, nums): """ :type nums: List[int]

我在leetcode中练习了“从排序数组中删除重复项”的测试。一切正常,但当我测试输入[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)
类解决方案(对象):
def移除副本(自身、nums):
"""
:type nums:List[int]
:rtype:int
"""
指数o=0
i=1
而我是Python190626.py
nums[索引]:1
索引o:-1
nums[i]:1
i:0
努姆斯:[1]
回溯(最近一次呼叫最后一次):
文件“190626.py”,第228行,在
打印(a.删除的副本(n))
文件“190626.py”,第217行,一式两份
打印(“nums[index_o]:”,nums[index_o])
索引器:列表索引超出范围
下面是一个正确的解决方案:

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)
类解决方案(对象):
def移除副本(自身、nums):
"""
:type nums:List[int]
:rtype:int
"""
指数o=0
i=1

在循环的第三次迭代中,当i时,有变量
i=-1
和n=[]。如果
作为
-1<0
等于
True
,您的代码将进入第一个
*

此时,您尝试使用变量
index\u o
访问数组,该变量为-2。由于数组为空,n[-2]返回
索引器错误:列表索引超出范围
错误

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


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

当第一次到达执行
while
循环时,如果
的语句为true,则变量
index_o
将取值-1,变量
i
将为0,而
while
循环将作为
i=0if
语句将检查索引外的
if nums[-1]==nums[0]
。我建议您添加一个
if
语句,以确保数组指针不会得到负值。

您是否考虑过通过在循环中打印变量
I
来进行调试,并查看它是什么?如果
n=[1,1]
if
n[0]==n[1]
remove,然后将
index\u o
设置为-1,i设置为0。我想你不是故意的。猜测之后,我认为n变成了一个空列表,因此任何索引都超出范围。使用
print()
显示变量中的值-这有助于发现问题。在nums[index\u o]之前打印index\u o,也可以在不使用I的情况下打印nums,以便在迭代时查看整个列表,而不是使用一个来维护两个索引。从索引1开始跳过索引0。如果
n[index-1]==n[index]
且不增加索引,则使用
n.pop(index)
。如果它们是不同的增量索引。继续,而
index
@Toothpick 1.set()内置无法使用,因为它需要“在适当的位置删除重复项”。2.我以前打印过,但数组不是空的,如下所示:-代码:…index_o-=1i-=1print(“nums[index_o]:”,nums[index_o])print(“index_:”,index_o)print(“nums[i]:”,nums[i])print(“i:”)----输出:nums[index_o]:1 index_o:-1 nums[i]:1 i:0回溯(最后一次调用):文件“190626.py”,第228行,打印中(a.removeDuplicates(n))文件“190626.py”,第217行,打印中的removeDuplicates(“nums[index_o]:”,nums[index_o])索引器:列出索引,共个range@CZ_want2b请更新您的问题,而不是尝试在注释中添加代码是的,您是对的,但它将返回true,即nums[-1]=last\u value\u of\u nums=nums[0]因此,它将删除nums的第一个和最后一个值,while循环将继续为真,因此它将继续尝试访问空列表的元素……我知道,我在30分钟前发表了这样的评论。您正在向已转换的用户布道。@问题是当nums[-1]=nums[0]时,程序停止,列表没有机会删除最后一个值。@CZ\u want2b当您试图访问nums[index\u o]以打印它时,程序停止。这意味着您试图访问已删除的NUM[0]。请尝试打印每个文件中的len(NUM)iteration@CZ_want2b注意:您的代码现在在实际打印时失败
print(“nums[index\u o]:”,nums[index\u o])
,因为nums现在为空,在尝试打印之前删除了最后一个元素。正如Kostas所说,如果您在这个失败的print语句之前打印nums或len(nums),您可以直接看到它
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)