理解set()函数

时间:2013-03-03 02:39:27

标签: python set

在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中尝试了上述两个。

5 个答案:

答案 0 :(得分:67)

正如你所说,

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

如果您想对它们进行排序,您只需执行以下操作:

sorted(set(y))

将生成包含集合元素的排序列表。 (不是一套。再次,集合是无序的。)

否则,set唯一保证的是它使元素唯一(不会有多于一次)。

希望这有帮助!

答案 1 :(得分:13)

作为无序集合类型,set([8, 1, 6])相当于set([1, 6, 8])

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

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

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

答案 2 :(得分:6)

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

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

答案 3 :(得分: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}

这是依赖于实现的,所以你不应该依赖它。

答案 4 :(得分:2)

在阅读其他答案之后,我仍然无法理解 为什么 该套装无法订购。

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