Qub*_*uba 30 python cpython set python-internals python-3.6
由于dictPython 3.6 中的实现发生了变化,现在默认排序.现在还set保留秩序吗?
我找不到任何关于它的信息,但由于这两种数据结构在它们工作的方式非常相似,我认为可能就是这种情况.
我知道dict在所有情况下都无法订购s,但它们大多数情况下都是如此.如Python文档中所述:
这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖它
MSe*_*ert 20
不,sets仍然是无序的.
您可以通过显示set应该具有"明确定义的哈希顺序" 1来验证这一点,以确保我们不会意外地获得set看起来有序但实际上不是:
>>> a_set = {3,2,1}
>>> a_set
{1, 2, 3}
>>> list(a_set)
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
如果订购了,您会期望{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]
Run Code Online (Sandbox Code Playgroud)
1 "定义良好的哈希顺序":
对于满足0 <= integer < sys.hash_info.modulus的整数hash只是数字本身.这意味着如果集合在哈希上"基于"排序(而不是基于插入"时间"排序)并且哈希值不会发生冲突(这就是为什么我使用的小数字和数字只相差一个)的顺序应该是确定性的,因为它们占据了集合中彼此相邻的插槽:
作为后者的一个例子:
>>> a_set = {6,7,8,9}
>>> a_set
{8, 9, 6, 7}
Run Code Online (Sandbox Code Playgroud)
Chr*_*nds 11
sets不是在Python 3.6中排序的,甚至不是CPython实现细节.一个简单的例子就是这样说
>>> import string
>>> string.digits
'0123456789'
>>> set(string.digits)
{'7', '0', '2', '8', '6', '9', '1', '5', '4', '3'}
Run Code Online (Sandbox Code Playgroud)
Python 3 文档很清楚:
集合是无序集合,没有重复元素.
| 归档时间: |
|
| 查看次数: |
6716 次 |
| 最近记录: |