Python新手遇列表索引越界问题:相邻重复元素去重代码报错
嘿,我来帮你搞定这个问题!你遇到的List index out of range错误其实是因为你的遍历逻辑没考虑到列表长度动态变化和遍历到最后一个元素时的索引溢出这两个关键点,我给你拆解清楚:
错误原因分析
你的代码里,for i in range(length)是基于列表的初始长度生成遍历范围的,但循环中你不断删除元素、缩短length,这就导致当i走到后期时,当前列表的实际长度已经小于初始的length了。举个具体例子:
比如初始
nums = [1,2,2,2,3,3],length=6,for循环会让i从0跑到5。当i=4时,你删除了nums[5],length变成5;接下来i=5的时候,此时nums的实际长度只有5,最大索引是4,nums[i+1]也就是nums[6]自然不存在,直接触发索引越界。
另外,就算i没到初始的length,当i是当前列表的最后一个元素时,nums[i+1]也会超出范围——比如当你把所有相邻重复元素都删完后,i可能刚好指向最后一个元素,这时候i+1就不存在了。
两种可行的解决方案
方案1:从后往前遍历(修改原列表)
从列表的倒数第二个元素开始往前遍历,这样就算删除i+1位置的元素,也不会影响前面的索引(因为我们从后往前处理,前面的元素索引不会被改变):
nums = [1,2,2,2,3,3] # 从倒数第二个元素开始,倒序遍历到第一个元素 for i in range(len(nums)-2, -1, -1): # 只要当前元素和下一个元素重复,就删除下一个元素 while nums[i] == nums[i+1]: del nums[i+1] print(nums) # 输出: [1, 2, 3]
方案2:构建新列表(更安全高效)
这种方法不需要修改原列表,而是从头开始构建一个没有相邻重复元素的新列表,逻辑更清晰,也不会有索引问题,而且时间复杂度更低:
nums = [1,2,2,2,3,3] if not nums: # 处理空列表的情况 result = [] else: result = [nums[0]] # 从第二个元素开始遍历 for num in nums[1:]: # 如果当前元素和结果列表的最后一个元素不同,就添加进去 if num != result[-1]: result.append(num) nums = result print(nums) # 输出: [1, 2, 3]
小提示
第二种方案其实更推荐,因为列表的del操作是O(n)时间复杂度(删除元素后后面的元素都要前移),如果列表很大的话,原方法和方案1的效率会比较低;而方案2只需要一次遍历,效率是O(n),代码也更易读~
内容的提问来源于stack exchange,提问作者Pranav Abraham

