【问题标题】:Why does a set display in same order if sets are unordered?如果集合是无序的,为什么集合以相同的顺序显示?
【发布时间】:2014-03-09 05:24:20
【问题描述】:

我从Python wikibook 开始初步了解python 语言。

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

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

给出的代码示例是:

s = set("blerg")

for letter in s:
     print letter

输出:

 r b e l g

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

【问题讨论】:

  • 存储项目的顺序是无序的,但这将是一致的(至少在 Python 2.x 中)。
  • 顺序未定义,但不是随机的。以相同顺序插入的同一组值将始终以相同顺序显示
  • 即。文档告诉你:“不要相信事情是按一定的顺序排列的,因为你可能(并且将会)感到惊讶”。如果您需要订购,请使用一些定制的集合(字典有这样的定制)。

标签: python set python-internals


【解决方案1】:

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

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

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

如果您想深入了解技术细节,请查看Why is the order in dictionaries and sets arbitrary?;集合的核心是字典,其中键是 set 值并且没有关联的字典值。与往常一样,实际的实现要复杂一些,但这个答案足以让你大部分时间到达那里。然后查看C source code for set 了解其他详细信息。

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

【讨论】:

  • 对于一个特定的集合,如果它没有变化,那么集合是否与有序列表相同?
  • @Vader:不,不应该 :-) 这是一个行话。文档未定义的东西的含义是软件工程中的一个常见概念。很遗憾,每个新手程序员首先在不同的地方点击它,但它不会帮助我们其他人在每次使用它时在世界上的每份文档中都完整地拼写出来。
  • @palerdot:无重复的无序列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多