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:列表索引超出范围
谁能告诉我代码有什么问题?
答案 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循环不知道边界已经改变,因此错误。