需要帮助查找python代码错误吗

2024-05-14 19:08:08 发布

您现在位置: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

索引器错误:列表索引超出范围

谁能告诉我我的代码出了什么问题?你知道吗


Tags: 代码列表lenreturnifdef错误else
3条回答

你的代码有几个问题。你知道吗

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

第二,正如John提到的,在循环浏览列表时,您正在删除列表中的项目。如果确实要保留当前结构,则需要在删除项时增加循环变量。你知道吗

更正/澄清:第二点不会导致索引错误,但会使代码跳过某些对的求值,例如对于[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]来尝试上面的代码。您将看到第一个1被删除,而不是列表中的第四个或第五个项目。这是因为列表上的remove除去了列表中出现的第一个实例。您可能应该改为del,如下所示:

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

最后,虽然不是一个bug,但最佳实践建议您不应该在循环遍历列表时修改它—这使得代码很难推理,并且可能导致微妙的bug。相反,如果你只是创建一个新的列表并返回它通常会更好。你知道吗

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])

另一种编写方法是使用zip和列表理解,这是Python的两个很酷的特性:

new_nums = [item1 for item1, item2 in zip(nums, nums[1:]) if item1 != item2]
new_nums.append(nums[-1])

你的问题是线while i < len(nums):。它将从0迭代到len-1,但下一行是if nums[i] == nums[i+1],因此索引将一直到len。你知道吗

更改为:

while i < len(nums) - 1:

您在遍历列表时正在从列表中删除项。for循环不知道边界已更改,因此会出现错误。你知道吗

相关问题 更多 >

    热门问题