59

在 python 中,set()是一个无重复元素的无序集合。但是,我无法理解它是如何生成输出的。

例如,考虑以下情况:

>>> x = [1, 1, 2, 2, 2, 2, 2, 3, 3]
>>> set(x)
set([1, 2, 3])

>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> set(y)
set([8, 1, 6])

>>> z = [1, 1, 6, 6, 6, 6, 6, 7, 7]
>>> set(z)
set([1, 6, 7])

的输出不应该set(y)是:set([1, 6, 8])?我在 Python 2.6 中尝试了以上两个。

4

5 回答 5

74

正如你所说,集合是无序的。尽管实现集合的一种方法是使用树,但它们也可以使用哈希表来实现(这意味着按排序顺序获取键可能不是那么简单)。

如果你想对它们进行排序,你可以简单地执行:

sorted(set(y))

这将产生一个包含集合元素的排序列表。(不是集合。同样,集合是无序的。)

否则,唯一能保证的set就是它使元素独一无二(不会出现不止一次)。

希望这可以帮助!

于 2013-03-03T02:45:12.003 回答
14

作为无序集合类型,set([8, 1, 6])等价于set([1, 6, 8]).

虽然按排序顺序显示集合内容可能会更好,但这会使repr()调用更加昂贵。

在内部,该set类型是使用散列表实现的:散列函数用于将项目分成多个桶,以减少检查项目是否是集合的一部分所需的相等操作的数量。

为了产生repr()输出,它只是依次输出每个桶中的项目,这不太可能是排序顺序。

于 2013-03-03T02:46:28.610 回答
7

正如 +Volatility 和您自己指出的那样,集合是无序的。如果您需要按顺序排列元素,只需调用sorted集合:

>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> sorted(set(y))
[1, 6, 8]
于 2013-03-03T02:43:38.560 回答
5

Python 的集合(和字典)会以某种顺序迭代并打印出来,但确切的顺序是任意的,并且不能保证在添加和删除后保持不变。

这是一个在添加并删除大量值后设置更改顺序的示例:

>>> s = set([1,6,8])
>>> print(s)
{8, 1, 6}
>>> s.update(range(10,100000))
>>> for v in range(10, 100000):
    s.remove(v)
>>> print(s)
{1, 6, 8}

不过,这取决于实现,因此您不应依赖它。

于 2013-03-03T02:50:03.130 回答
2

在阅读了其他答案之后,我仍然无法理解为什么该集合是无序的。

向我的伙伴提到了这个,他想出了这个比喻:拿弹珠。你把它们放在比大理石宽度稍宽的管子里:你有一个清单。然而,一套是一个袋子。即使你把弹珠一个一个地喂进袋子里;当您将它们从袋子中倒回管中时,它们的顺序将不同(因为它们都混在了袋子中)。

于 2017-08-25T20:23:14.393 回答