繁体   English   中英

集合是否像 python3.6 中的字典一样排序

[英]Are sets ordered like dicts in python3.6

由于 Python 3.6 中dict实现的变化,它现在默认排序。 现在set保留顺序吗?

我找不到任何关于它的信息,但由于这两种数据结构在其底层工作方式上非常相似,我认为可能是这种情况。

我知道没有承诺在所有情况下都订购dict ,但大多数情况下都是如此。 正如 Python 文档中所述:

这个新实现的顺序保留方面被认为是一个实现细节,不应依赖

不, set仍然是无序的。

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

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

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

虽然dict s实际上是有序的(同一个例子只是做了一点修改):

>>> 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.modulus0 <= integer < sys.hash_info.modulushash只是数字本身。 这意味着如果集合是基于散列“基于”排序(而不是基于插入“时间”排序)并且散列值不冲突(这就是为什么我使用小数字和仅相差一个的数字)顺序应该是确定性的,因为它们占据集合内彼此相邻的插槽:

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

以后者为例:

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

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

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

Python 3文档对此很清楚:

集合是没有重复元素的无序集合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM