Python中1和True的集合解释

12
在IPython 3交互式Shell中:
In [53]: set2 = {1, 2, True, "hello"}

In [54]: len(set2)
Out[54]: 3

In [55]: set2
Out[55]: {'hello', True, 2}

这是因为数字1和布尔值True在Python中被解释为相同的值,所以使用set函数时会自动去重,只保留其中一个(True)。如何保留它们两个呢?


3
不要使用集合。尝试使用1 + True。它们是相同的东西,因此不要尝试将它们分开。 - JBernardo
为什么需要同时保留 1True?它们唯一的区别在于类型。据我所知,在所有其他方面,它们是可以互换的。 - TigerhawkT3
或者你可以将数字保留为字符串格式,并在需要时进行类型转换。 - Tanveer Alam
2
一个set应该只包含相同类型的元素。那么为什么需要不同类型的元素呢? - Daniel
1
紧密相关:https://dev59.com/hF0Z5IYBdhLWcg3w-UZ- - jonrsharpe
也与此密切相关:http://stackoverflow.com/questions/14352488/python-identity-in-sets-of-objects-and-hashing - John Y
2个回答

13

集合是一组可哈希的对象。尽管语句1 is True为False,但语句1 == True为True。因此,它们具有相同的哈希值且无法在集合中分别存在,不能同时保存它们两个到一个集合中

编辑 为了明确起见,正如jme所指出的那样,这是因为两个属性都成立 - 它们相等(根据__eq__)并且具有相同的哈希值(根据__hash__)。

在完美的世界中,相等的对象也将具有相同的哈希值,幸运的是,对于内置类型来说,这是正确的。


6
澄清一下:两个具有相同哈希值的项目可以出现在同一个集合中。然而,它们必须是不相等的。 - jme

0
这是一个使用集合机制获取不同值的示例:
def get_distinct_values(values):
  set_of_values = set()
  for value in values:
    hash_value = hash(value)
    set_of_values.update([value])
  return set_of_values

get_distinct_values([1,2,True,False,int(0.5)])

输出:

{False, 1, 2}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接