2024-05-14 19:08:08 发布
网友
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
索引器错误:列表索引超出范围
谁能告诉我我的代码出了什么问题?你知道吗
你的代码有几个问题。你知道吗
正如AbhiP所指出的,您正在查看列表中的连续项对-您应该比较len(nums)-1对,但您正在尝试比较len(nums)对。这是索引错误的一个原因。你知道吗
len(nums)-1
len(nums)
第二,正如John提到的,在循环浏览列表时,您正在删除列表中的项目。如果确实要保留当前结构,则需要在删除项时增加循环变量。你知道吗
更正/澄清:第二点不会导致索引错误,但会使代码跳过某些对的求值,例如对于[1, 1, 1, 2]等输入,从而导致错误。你知道吗
[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,如下所示:
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的两个很酷的特性:
zip
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):
len-1
if nums[i] == nums[i+1]
len
更改为:
while i < len(nums) - 1:
您在遍历列表时正在从列表中删除项。for循环不知道边界已更改,因此会出现错误。你知道吗
你的代码有几个问题。你知道吗
正如AbhiP所指出的,您正在查看列表中的连续项对-您应该比较
len(nums)-1
对,但您正在尝试比较len(nums)
对。这是索引错误的一个原因。你知道吗第二,正如John提到的,在循环浏览列表时,您正在删除列表中的项目。如果确实要保留当前结构,则需要在删除项时增加循环变量。你知道吗
更正/澄清:第二点不会导致索引错误,但会使代码跳过某些对的求值,例如对于
[1, 1, 1, 2]
等输入,从而导致错误。你知道吗考虑到这两点,您的代码将如下所示:
这将删除索引错误。你知道吗
第三,
nums.remove(nums[i])
也会导致非索引错误。用nums
作为[1, 2, 3, 1, 1]
来尝试上面的代码。您将看到第一个1
被删除,而不是列表中的第四个或第五个项目。这是因为列表上的remove
除去了列表中出现的第一个实例。您可能应该改为del
,如下所示:最后,虽然不是一个bug,但最佳实践建议您不应该在循环遍历列表时修改它—这使得代码很难推理,并且可能导致微妙的bug。相反,如果你只是创建一个新的列表并返回它通常会更好。你知道吗
另一种编写方法是使用
zip
和列表理解,这是Python的两个很酷的特性:你的问题是线
while i < len(nums):
。它将从0迭代到len-1
,但下一行是if nums[i] == nums[i+1]
,因此索引将一直到len
。你知道吗更改为:
您在遍历列表时正在从列表中删除项。for循环不知道边界已更改,因此会出现错误。你知道吗
相关问题 更多 >
编程相关推荐