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

Python列表对比异常:误判1为共同元素且遗漏True的原因?

列表对比误判1为共同元素、遗漏True的原因

下面这段代码用于对比两个列表并提取共同元素,但输出结果不符合预期——错误地将1判定为共同元素,却遗漏了两个列表都存在的布尔值True:

def compare_two_lists(list_1, list_2):
    common_elements= set()
    
    for i in  range(len(list_1)):
            if  list_1[i] in list_2:
                common_elements.add(list_1[i])
                
    return common_elements                


# Define the first list
list_1 = ["Adam",1 ,100 ,True ]

# Define the second list
list_2 = ["Adam",-100 ,100,True,30 , "Adam" ]

common_items = compare_two_lists(list_1,list_2)

if  len(common_items) !=0:
    print("The two lists have common elements : ", common_items)

else:
    print("No common elements found ! ")

错误输出:

The two lists have common elements : {1, 'Adam', 100}


问题原因

这是Python布尔值的特性导致的:

  • Python中True是int类的子类,True的数值等价于1(1 == True返回True),False等价于0。
  • in运算符仅检查值是否相等,不校验类型。所以1 in list_2会返回True——因为list_2里的True和1值相等;而True in list_2虽然也返回True,但集合是根据元素的哈希值去重的,hash(True)和hash(1)完全相同,集合会将二者视为同一元素,最终只保留先被加入的1,导致True被“覆盖”遗漏。

修复方案

如果需要严格区分整数和布尔值,要同时检查值和类型是否匹配。可以修改函数如下:

def compare_two_lists(list_1, list_2):
    # 将list_2的元素转换为(值,类型)的元组集合,用于精准查找
    list2_items = {(item, type(item)) for item in list_2}
    # 遍历list_1,筛选出值和类型都匹配的元素
    return {item for item in list_1 if (item, type(item)) in list2_items}

运行后会得到正确结果:{'Adam', 100, True}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:23:27