需要帮助才能找到python代码错误

时间:2015-06-11 04:23:31

标签: python

def remove_adjacent(nums):
  i = 0
  while i < len(nums):
     if nums[i] == nums[i+1]: 
        nums.remove(nums[i])
        i = i + 1
     else: i = i + 1
  return nums

IndexError:列表索引超出范围

谁能告诉我代码有什么问题?

3 个答案:

答案 0 :(得分:3)

您的代码存在一些问题。

正如AbhiP指出的那样,您正在查看列表中的连续项目对 - 您应该比较len(nums)-1对,但是您正在尝试比较{{1} }对。这是索引错误的一个原因。

其次,正如约翰所提到的那样,当你循环播放时,你会删除列表中的项目。如果你真的想保留当前的结构,你需要在删除项目时增加循环变量。

更正/澄清:这第二点不会导致索引错误,但是通过使代码跳过某些对的评估会导致错误,例如对于len(nums)等输入。

考虑到这两点,您的代码将如下所示:

[1, 1, 1, 2]

这将删除索引错误。

第三,i = 0 while i < len(nums) - 1: if nums[i] == nums[i+1]: nums.remove(nums[i]) else: i += 1 也会导致非索引错误错误。在nums.remove(nums[i])nums的情况下尝试上述代码。您将看到第一个[1, 2, 3, 1, 1]被删除,而不是列表中的第4个或第5个项目。这是因为列表中的1会删除列表中显示的第一个实例。您应该改为remove,如下所示:

del

最后,虽然不是错误,但最佳做法是建议您在循环时不应修改列表 - 这会使代码难以推理,并可能导致细微的错误。相反,如果您只是创建一个新列表并返回该列表,通常会更好。

i = 0
while i < len(nums) - 1:
    if nums[i] == nums[i+1]:
        del nums[i]
    else:
        i += 1

使用new_nums = [] for i in range(len(new_nums)-1): if nums[i] != nums[i+1]: new_nums.append(nums[i]) new_nums.append(nums[-1]) 和列表推导来编写此代码的另一种方法,这是Python的两个很酷的功能:

zip

答案 1 :(得分:1)

您的问题是while i < len(nums):行。它会从0到len-1迭代,但是你正在做的下一行if nums[i] == nums[i+1]所以索引将一直持续到len

将其更改为:

while i < len(nums) - 1:

答案 2 :(得分:0)

您正在迭代它时从列表中删除项目。 for循环不知道边界已经改变,因此错误。