python - 集合是在内部排序的,还是显示排序列表的 __str__ 方法?

标签 python python-2.7 set

我有一个 set,我向其中添加项目(整数),当我打印它时,项目显然已排序:

a = set()
a.add(3)
a.add(2)
a.add(4)
a.add(1)
a.add(5)

print a
# set([1, 2, 3, 4, 5])

我尝试过各种值,显然它只需要是整数。

我在 MacOSX 下运行 Python 2.7.5。它也使用 repl.it 复制(参见 http://repl.it/TpV )

问题是:这是否在某处记录(目前尚未找到),是否正常,是否可以依赖?

附加问题:排序什么时候完成?在打印期间?它是内部存储排序的吗? (考虑到插入的预期恒定复杂性,这甚至可能吗?)

最佳答案

这是巧合。数据既不排序也不 __str__ 排序。

整数的哈希值等于它们的值(-1sys.maxint 范围外的长整数除外),这增加了机会 整数是按顺序插入的,但这不是给定的。

set 使用哈希表来跟踪包含的项目,排序取决于哈希值、插入和删除历史记录。

整数和集合之间交互的方式和原因都是实现细节,并且很容易因版本而异。 Python 3.3 为某些类型引入了哈希随机化,Python 3.4 对此进行了扩展,使得集合和字典的排序在 Python 进程重新启动之间也变得易变(取决于存储的值的类型)。

关于python - 集合是在内部排序的,还是显示排序列表的 __str__ 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24126240/

相关文章:

python - 不区分大小写的集合交集

python-2.7 - 在pygame中让多个球移动

python - Django 1.6.5 和 1.5.4 Tango 与 django

python - 如何获取具有唯一属性的对象列表

c++ - 修改集合内对象的可变成员是否安全?

python - genfromtxt 加载按行排列的数据

python - 为什么这些列表方法(追加、排序、扩展、删除、清除、反转)返回 None 而不是结果列表?

Python Scrapy 无法从类中提取文本

haskell - 数据结构请求 : Lazily infinite set

python - 元组比较