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

为何使用该Python代码删除列表重复元素后列表未改变?

问题分析与修复方案

嘿,我来帮你排查这段代码的问题!你的思路是用双层循环对比元素来删除重复项,但几个关键细节处理错了,导致列表完全没变化:

  • j的初始化位置不对:你把j=0放在了函数最开头,这意味着第一次外层循环(i=0)执行完后,j已经变成了列表的长度,后续的外层循环里,内层while j<len(item)的条件直接不成立,根本不会执行判断和删除操作。
  • 删除元素后j的处理有误:当你删除item[j]时,列表长度会减1,后面的元素会往前挪一位,但你紧接着执行j+=1,这会跳过当前位置新移过来的元素,可能漏删重复项。
  • 内层循环起始位置可以优化:其实不需要每次都从j=0开始,前面的i已经处理过了,j从i+1开始就能避免重复对比。

修复后的代码

调整j的初始化位置,同时处理删除元素后的j值:

item = [1,2,3,4,5,6,7,8,9,1,2,6,7]
def duplicated(item):
    i = 0
    while i < len(item):
        # 每次外层循环开始时,j从i的下一个位置启动
        j = i + 1
        while j < len(item):
            if item[j] == item[i]:
                del item[j]
                # 删除元素后不递增j,因为后续元素已经前移
            else:
                j += 1
        i += 1
    return item

print(duplicated(item))  # 输出: [1,2,3,4,5,6,7,8,9]

更简洁的实现方式

如果不需要保留元素的原始顺序,用集合去重是最省事的:

item = [1,2,3,4,5,6,7,8,9,1,2,6,7]
unique_item = list(set(item))
print(unique_item)  # 输出顺序可能变化,比如[1,2,3,4,5,6,7,8,9]

如果需要严格保留原始顺序(和你的代码逻辑一致),Python 3.7+可以用字典快速实现:

item = [1,2,3,4,5,6,7,8,9,1,2,6,7]
unique_item = list(dict.fromkeys(item))
print(unique_item)  # 输出: [1,2,3,4,5,6,7,8,9]

这种方式比双层循环的性能要好得多哦!

内容的提问来源于stack exchange,提问作者Sergio Prieto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:36:54