Python列表去重代码失效原因:为何无法得到预期结果?
代码无法正确去重的原因分析
1. 遍历列表时直接修改原列表,导致迭代跳过元素
Python的for循环遍历列表时,是按初始的索引顺序逐个取元素。当你在循环里调用num.remove(i)删除元素时,列表长度会变短,后续元素会往前移位填补空缺,但迭代器的索引不会回退,直接跳到下一个位置,这就导致部分元素根本没被遍历到。
举个具体执行步骤:
- 原列表:
[5, 7, 21, 7, 5, 7, 7, 5, 7 , 7] - 第一次循环取到
5,因count(5)=3≠1,删除第一个5,列表变为[7, 21, 7, 5, 7, 7, 5, 7, 7] - 迭代器接下来访问索引
1,取到的是21(原本的索引2元素),直接跳过了当前列表索引0的7,这个7永远不会进入循环处理。
2. 判断逻辑的漏洞:count(i)!=1的条件无法覆盖所有重复元素
当删除一个重复元素后,该元素的count值会减少,但因为部分元素被迭代跳过,剩下的重复元素不会被检查到。比如原列表中的7多次出现,被跳过的7没有进入循环判断,最后就会残留下来。
正确实现思路参考
如果要保留每个元素至少一个且维持原顺序,应该遍历原列表的副本,或者创建新列表存储结果:
num = [5, 7, 21, 7, 5, 7, 7, 5, 7 , 7] result = [] for i in num: if i not in result: result.append(i) print(result) # 输出 [5, 7, 21],若需和期望顺序一致可调整逻辑
如果不关心元素顺序,直接用集合去重更简洁:list(set(num))
内容的提问来源于stack exchange,提问作者Abhinav Gajria
相关产品推荐
相关产品推荐

