You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:22:21