为何我的Python列表去重代码出现列表索引越界的ValueError?
列表去重时索引越界问题的解决
你的代码执行时触发索引越界,核心原因是循环过程中直接修改了原列表长度:
- 外层循环的
range(len(inp_list))是基于列表初始长度生成的固定序列,但每次remove操作都会让列表变短 - 循环到后期,原有的
i值会超出缩短后列表的最大索引,导致inp_list[i]触发ValueError - 同时,
remove操作会让后续元素前移,内层循环的j会跳过部分元素,导致去重不彻底
解决方法
方法1:创建新列表保存去重结果(保持原顺序)
逻辑简单直观,不会修改原列表,是最常用的去重方式:
inp_list=[10,1,11,1,29,876,768,10,11,1,92,29,876] unique_list = [] for num in inp_list: if num not in unique_list: unique_list.append(num) print(unique_list) # 输出: [10, 1, 11, 29, 876, 768, 92]
方法2:利用字典去重(效率更高,Python3.7+保持顺序)
字典的键具有唯一性,dict.fromkeys()会保留元素的插入顺序,时间复杂度更低:
inp_list=[10,1,11,1,29,876,768,10,11,1,92,29,876] unique_list = list(dict.fromkeys(inp_list)) print(unique_list) # 输出: [10, 1, 11, 29, 876, 768, 92]
方法3:倒序遍历修改原列表
如果一定要在原列表上修改,可采用倒序遍历——删除后面的元素不会影响前面的索引,避免越界:
inp_list=[10,1,11,1,29,876,768,10,11,1,92,29,876] # 倒序遍历外层索引 for i in range(len(inp_list)-1, -1, -1): # 内层倒序遍历,找到重复就删除当前元素 for j in range(i-1, -1, -1): if inp_list[i] == inp_list[j]: inp_list.pop(i) break print(inp_list) # 输出: [10, 1, 11, 29, 876, 768, 92]
内容的提问来源于stack exchange,提问作者Taniya Pal
相关产品推荐
相关产品推荐

