10

我首先看一下Python wikibook中的 python 语言。

对于集合,提到了以下内容:

我们还可以对集合中的每个项目进行循环移动。但是,由于集合是无序的,因此未定义迭代将遵循的顺序。

给出的代码示例是:

s = set("blerg")

for letter in s:
     print letter

输出:

 r b e l g

当我运行程序时,无论我运行多少次,我都会以相同的顺序得到结果。如果集合是无序的并且迭代顺序未定义,为什么它以相同的顺序返回集合?该命令的依据是什么?

4

1 回答 1

14

它们不是随机排列的,它们是任意排列的。这意味着您不应该指望维护的插入顺序,因为实际的内部实现细节决定了顺序。

顺序取决于集合的插入和删除历史。

在 CPython 中,集合使用哈希表,其中插入的值根据从hash()函数返回的值、对表大小和冲突处理算法进行取模插入到稀疏表中。列出设置的内容然后返回此表中排序的值。

如果您想深入了解技术细节,请查看为什么字典和集合中的顺序是任意的?; 集合的核心是字典,其中键是set值,并且没有关联的字典值。与往常一样,实际的实现要复杂一些,但这个答案足以让你大部分时间到达那里。然后查看C 源代码以set了解其余详细信息。

将此与列表进行比较,列表确实具有您可以影响的固定顺序;您可以在列表中移动项目,并为您维护新的排序。

于 2014-02-11T12:17:52.447 回答