【问题标题】:I am seeking the logic python is using to arrive at unique elements in a set我正在寻找 python 用来获取集合中唯一元素的逻辑
【发布时间】:2021-08-30 00:42:03
【问题描述】:

在版本中。 3.9.5:

>>> s1 = {True,1,1,2}
>>> s1
{True, 2}
>>> s2 = {1,1,True,2}
>>> s2
{1, 2}

给人的印象是 True 之后的所有后续 1 都被丢弃,并且 1 之后的所有 True 也被丢弃,同时正在构造 set 对象。但是在这两种情况下都不会忽略除 1 之外的其他 Truthy 值。

>>> s3 = {False,0,""}
>>> s3
{False, ''}

>>> s3 = {False,(),0,""}
>>> s3
{False, '', ()}
>>> s4 = {0,False,(),0,""}
>>> s4
{0, '', ()}

比对 False 和零。

我无法在 3.9.5 的 python 文档中明确找到有关此逻辑的信息。但是我可以看到一些关于字典实现的文献,而没有使用键来创建集合和优化要求。我还瞥见了set object implementation 的集合对象实现,这超出了初学者的范围,我向这 49 位贡献者和 Ramond Hettinger 先生致敬。简单地说,我理解底层逻辑使用散列函数来区分不同的值。 因此我必须使用

>>> hash(True)
1
>>> hash(3)
3
>>> hash(0)
0
>>> hash(False)
0
>>> hash(())
5740354900026072187

向初学者解释为什么设置对象构造会这样。但是

>>> hash("")
0

尽管它被包含在上面的 s4 示例中。因此我需要进一步的逻辑。

现在回答问题。是否有任何 python 文档或文章解释了在构造集合对象时确定唯一元素的方式,以使 Python 初学者受益。我在各种教程中的搜索都是徒劳的。我是否遗漏了一些非常明显的东西?

感谢您的宝贵时间。

【问题讨论】:

    标签: python hash set


    【解决方案1】:

    发生这种情况的原因 - 很奇怪,但在编程语言的上下文中很正常 - 是因为 Python 的布尔值实际上是整数的子类型(具体来说是01)。

    isinstance(False, int) # >>> True
    isinstance(True, int) # >>> True
    

    这组移除一个或另一个的原因是什么(取决于顺序)。

    >>> {1, True}
    {1}
    >>> {True, 1}
    {True}
    >>> {0, False}
    {0}
    >>> {False, 0}
    {False}
    >>> {True, False}
    {False, True} # Note the order change here as well.
    >>> {0, 1}
    {0, 1}
    

    Built-in Types - Numeric Types下备注:

    共有三种不同的数字类型:整数、浮点数和复数。 此外,布尔值是整数的子类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多