Python 为什么列表(set([2,1,3,6,5,3,6,4])会自动对列表排序?
我曾在python中试验过Python 为什么列表(set([2,1,3,6,5,3,6,4])会自动对列表排序?,python,list,sorting,set,Python,List,Sorting,Set,我曾在python中试验过set,虽然我明白这一点,但奇怪的是,在python 2中和python 3中,它都会自动对这些数字进行排序: 列表(集合([2,1,3,6,5,3,6,4])) [1, 2, 3, 4, 5, 6] >>>列表(集合([2,1,3,6,5,3,6,4,0,7])) [0, 1, 2, 3, 4, 5, 6, 7] 我在谷歌上搜索了一段时间,但没有找到这两个函数组合行为的答案。没有,下面是一个例子 In [2]: list(set([1,9,5,10]))
set
,虽然我明白这一点,但奇怪的是,在python 2中和python 3中,它都会自动对这些数字进行排序:
列表(集合([2,1,3,6,5,3,6,4]))
[1, 2, 3, 4, 5, 6]
>>>列表(集合([2,1,3,6,5,3,6,4,0,7]))
[0, 1, 2, 3, 4, 5, 6, 7]
我在谷歌上搜索了一段时间,但没有找到这两个函数组合行为的答案。没有,下面是一个例子
In [2]: list(set([1,9,5,10]))
Out[2]: [1, 10, 5, 9]
此外,从文档中:
集合对象是不同的散列对象的无序集合
有时,您看到排序输出的原因取决于散列的计算方式,有时还取决于使用了什么REPL,本文对此行为进行了详细描述
例如,对于ipython
,当我们启用时,集合的打印方式会发生变化,这将禁用ipython的pretty printing
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}
这不是集合的特征,只是集合创建方式的巧合。
列表中项目的散列是数字本身。因此,在某些情况下,所创建的集合将显示这种行为,但绝不可靠。
看看你可以了解更多。奇怪,但是如果我添加更多的数字,它会:列表(set([2,1,3,6,5,3,6,5,3,6,5,6,6,5,3,3,6,4,0,7,10,9])
->[0,1,2,3,4,5,6,7,9,10]
如果实现使用二叉树或类似的数据结构,而不是哈希表,那么结果将被排序。但是你不应该假设是这样的,因为文档明确地说它不是有序的。可能只是散列桶排列的方式。是的,我想这完全是基于可能性,这只是一个奇怪的巧合