【问题标题】:Why does list(set([2,1,3,6,5,3,6,4])) automatically order the list?为什么 list(set([2,1,3,6,5,3,6,4])) 会自动对列表进行排序?
【发布时间】:2019-05-17 11:31:39
【问题描述】:

我在 python 中尝试使用set,虽然我知道它是unsorted, based on hashes,但我觉得奇怪的是它会自动对这些数字进行排序,无论是在 Python 2 中还是在 Python 3 中:

>>> list(set([2,1,3,6,5,3,6,4]))
[1, 2, 3, 4, 5, 6]
>>> list(set([2,1,3,6,5,3,6,4,0,7]))
[0, 1, 2, 3, 4, 5, 6, 7]

我搜索了一段时间,但没有找到这两个函数组合行为的答案。

【问题讨论】:

  • 可能只是哈希桶排列的方式。
  • 是的,我猜这完全是基于可能性,这只是一个奇怪的巧合

标签: python list sorting set


【解决方案1】:

没有,这里有一个例子

In [2]: list(set([1,9,5,10]))                                                                                                                                                                                                
Out[2]: [1, 10, 5, 9]

另外,来自文档:https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset

集合对象是不同的可散列对象的无序集合。

有时您看到排序输出的原因取决于hash 的计算方式,有时取决于正在使用什么REPL,此行为在answer 中有很好的描述

ipython 的示例,集合的打印方式在我们启用 doctest_mode 时发生变化,这会禁用 pretty-printingipython

In [1]: set([1,6,8,4])                                                                                                                                                                                                       
Out[1]: {1, 4, 6, 8}

In [2]: %doctest_mode                                                                                                                                                                                                        
Exception reporting mode: Plain
Doctest mode is: ON
>>> set([1,6,8,4])                                                                                                                                                                                                           
{8, 1, 4, 6}

【讨论】:

  • 奇怪,但如果我添加更多数字,它会:list(set([2,1,3,6,5,3,6,4,0,7,10,9])) -> [0, 1, 2, 3, 4, 5, 6, 7, 9, 10]
  • 如果实现使用二叉树或类似的数据结构,而不是哈希表,那么结果将是有序的。但你不应该假设是这种情况,因为文档明确表示它不是有序的。
【解决方案2】:

这不是集合的特性,只是集合创建方式的巧合。 列表中项目的哈希是数字本身。所以在某些情况下,创建的集合会表现出这种行为,但绝不是可靠的。
查看this answer,您可以了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多