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
相关产品推荐
相关产品推荐

