本问题已经有最佳答案,请猛点这里访问。
很抱歉,如果这是一个基本问题,但是我想了解set类型在python中是如何工作的。
来自文档:
A set object is an unordered collection of distinct hashable objects.
Being an unordered collection, sets do not record element position or order of insertion.
号
但是,如果它们没有顺序,为什么我在这个测试中总是得到相同的顺序呢?我在等一些随机的订单。
users_ids = set([1, 1, 2, 3])
>>> print users_ids
set([1, 2, 3])
因为您使用的是整数,所以它们将按顺序散列。
@这并不总是。它还取决于整数的大小
@SMAC89这是一个公平的观点。
随机顺序不是无序的。无序意味着没有定义的数据排序方式,即插入顺序或数据与数据排列方式没有任何关联。
数据总是以可预测的顺序排列的原因,因为发生这种情况时,特定的实现选择始终以插入顺序指示数据顺序的方式排列元素。但是,不能保证会发生这种情况,我们确实在python 3.x字典实现中看到了这种偏差。
注意,即使我们看到数据已排序,
>>> {1,2,3,4,5}
set([1, 2, 3, 4, 5])
我们仍然称之为无序,除非文件严格规定并保证其订单,否则可能会有惊喜等待您。我见过依赖于集合和字典在插入模式中保持有序的事实的实现。当这些实现被移植到python 3.x时,会产生严重的后果。
γ
What’s New In Python 3.3
Security improvements:
Hash randomization is switched on by default.
号
您将共享一个描述Python3.x字典实现的链接,以及它与Python2.x的区别吗?
让我看看我是否理解。在python 2.7中,集合是无序的,但特定的实现保持插入顺序?!在这种情况下,它们可能是订购的,但在未来的版本中不能保证。我的理解正确吗?
@但是,3.3以后的差异是由于散列的随机性-请参阅stackoverflow.com/a/14959001/3001761
@用户2990084:说它保持插入顺序是错误的,但我的意思是,每次以特定的顺序插入相同的数据时,字典都会以定义的方式维护。
@用户2990084:我已经用链接更新了答案。
@用户2990084看到保留顺序的原因是您使用的是顺序整数。python 2.x散列的方式,您的示例恰好是"有序的"。