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

Python列表去重时True值被误删的原因及正确代码实现

底层原因

Python中布尔类型bool是整数类型int的子类,存在固定的等值映射规则:

  • True的整数值等价于1,True == 1的判断结果为True
  • False的整数值等价于0,False == 0的判断结果为True

列表的in成员判断底层是通过==运算符做等值比较,不会额外校验两个值的类型是否一致。原代码遍历到True元素时,新列表lst2中已经存在整数1,True == 1成立,因此判定True已经存在,不会将其追加到新列表中,最终出现True被误删的问题。
而False没有被误删,是因为原列表在False之前没有出现过整数0,等值判断不成立,因此可以正常被追加到结果中。

可以通过以下代码验证这个语言特性:

print(isinstance(True, int))       # 输出:True
print(True == 1)                   # 输出:True
print(hash(True) == hash(1))       # 输出:True,直接用set()去重也会踩同样的坑
print(False == 0)                  # 输出:True
正确实现方案

要实现预期的去重效果,需要把「值+类型都完全一致」作为重复判定标准,以下是两种可直接运行的实现:

方案1:通用遍历写法(兼容所有Python版本)

遍历原列表时,用元组存储每个元素的类型和值作为去重依据,只有类型和值都没出现过才追加到结果列表:

lst = [1, 3, 2, 1, 3, True, False, True, "apple", "banana", "mango", "apple"]
result = []
seen = []
for item in lst:
    unique_key = (type(item), item)
    if unique_key not in seen:
        seen.append(unique_key)
        result.append(item)
print(result)

运行输出:[1, 3, 2, True, False, 'apple', 'banana', 'mango'],和预期结果一致。

方案2:字典去重写法(Python3.7+支持,效率更高)

Python3.7及以上版本字典默认保留插入顺序,可以利用字典key自动去重的特性实现更高效的去重(字典key查找时间复杂度为O(1),远高于列表in判断的O(n),适合长列表场景):

lst = [1, 3, 2, 1, 3, True, False, True, "apple", "banana", "mango", "apple"]
result = list({(type(item), item): item for item in lst}.values())
print(result)

内容的提问来源于stack exchange,提问作者Nikhil R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:27:13