实现列表去重时出现Index out of range错误的技术咨询
分析与修复:列表去重时的"list index out of range"错误
错误原因拆解
你的代码触发索引越界,主要有两个核心问题:
把列表元素当成索引来用:
for i in myList这个循环遍历的是列表里的元素值,不是元素的索引!比如第一次循环i是1(列表第一个元素),然后你写t = myList[i],实际取的是myList[1]也就是2,这本身逻辑就错了。当元素值大于等于当前列表长度时(比如原列表里的9,当列表长度缩短后,9作为索引肯定超过范围),直接就会抛出list index out of range。遍历过程中修改列表长度导致索引混乱:
当你用del myList[j]删除元素时,列表的长度会立刻缩短,后续元素会向前移位。比如你删除了索引j的元素,原来索引j+1的元素现在跑到了j的位置,但你的循环会继续走到j+1,这不仅会跳过这个元素,还可能在循环后期因为j超过了缩短后的列表长度而触发索引越界。
正确的列表去重实现方法
根据你的需求(保留元素首次出现的顺序,仅保留唯一元素),这里提供几种常用方案:
方案1:利用字典有序性(Python 3.7+推荐)
Python 3.7及以上版本中,字典会保留键的插入顺序,我们可以用dict.fromkeys()快速去重,同时保持原顺序:
myList = [1, 2, 4, 4, 1, 4, 2, 6, 2, 9] unique_list = list(dict.fromkeys(myList)) print("The list with unique elements only:") print(unique_list) # 输出: [1, 2, 4, 6, 9]
方案2:遍历+已见集合(兼容所有Python版本)
手动遍历列表,用一个集合记录已经见过的元素,只保留首次出现的元素:
myList = [1, 2, 4, 4, 1, 4, 2, 6, 2, 9] seen = set() unique_list = [] for num in myList: if num not in seen: seen.add(num) unique_list.append(num) print("The list with unique elements only:") print(unique_list) # 输出: [1, 2, 4, 6, 9]
方案3:修复你原来的索引遍历思路
如果你想基于原有的嵌套循环思路修复,可以倒序遍历索引,这样删除元素不会影响前面的索引(因为我们从后往前处理,前面的索引位置不会因为后面元素被删而移位):
myList = [1, 2, 4, 4, 1, 4, 2, 6, 2, 9] # 倒序遍历索引,从最后一个元素到第一个 for i in range(len(myList)-1, -1, -1): t = myList[i] # 遍历当前元素之前的所有元素(因为倒序,所以i-1到0) for j in range(i-1, -1, -1): if myList[j] == t: del myList[j] print("The list with unique elements only:") print(myList) # 输出: [1, 2, 4, 6, 9]
内容的提问来源于stack exchange,提问作者Swapnil Pandey
相关产品推荐
相关产品推荐

