集合是否像Python3.6中的指令一样有序

2024-05-20 10:10:36 发布

您现在位置:Python中文网/ 问答频道 /正文

由于Python 3.6中的dict实现发生了变化,现在默认情况下,它是按顺序排列的。现在set也能保持顺序吗?

我找不到关于它的任何信息,但由于这两种数据结构在幕后的工作方式非常相似,我想可能是这样的。

我知道在任何情况下都不能保证dicts被订购,但大多数情况下都是这样。如Python文档所述:

The order-preserving aspect of this new implementation is considered an implementation detail and should not be relied upon


Tags: ofthe文档信息数据结构顺序方式情况
2条回答

不,sets仍然是无序的。

您可以通过显示应该具有“定义良好的散列顺序”的set来验证这一点,以确保我们不会意外地得到看起来有序但实际上不是这样的set

>>> a_set = {3,2,1}
>>> a_set
{1, 2, 3}
>>> list(a_set)
[1, 2, 3]

如果它是有序的,那么您将期望{3, 2, 1}[3, 2, 1]作为示例的结果。

dicts实际上是有序的(同一个例子只是稍微修改了一下):

>>> a_dict = {3: 3, 2: 2, 1:1}
>>> a_dict
{3: 3, 2: 2, 1: 1}
>>> list(a_dict)
[3, 2, 1]

1“定义良好的散列顺序”:

对于满足0 <= integer < sys.hash_info.modulus的整数,hash只是数字本身。这意味着,如果集合是根据散列“排序”的(而不是根据插入“时间”排序),并且散列值没有冲突(这就是为什么我使用小数字和只相差一个的数字),那么顺序应该是确定的,因为它们占据了集合中彼此相邻的插槽:

  • 从最小到最高
  • 或者从一个特定值到最高值,然后从最小值到特定值。如果集合中的下一个空闲时隙(在相邻的意义上)是第一个空闲时隙,则会发生这种情况。

作为后者的一个例子:

>>> a_set = {6,7,8,9}
>>> a_set
{8, 9, 6, 7}

sets在Python 3.6中没有排序,甚至没有作为CPython实现细节排序。一个简单的例子说明了这一点:

>>> import string
>>> string.digits
'0123456789'
>>> set(string.digits)
{'7', '0', '2', '8', '6', '9', '1', '5', '4', '3'}

Python 3docs清楚地表明了这一点:

A set is an unordered collection with no duplicate elements.

相关问题 更多 >