理解set()函数

59 投票
5 回答
148346 浏览
提问于 2025-04-17 17:44

在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 个回答

7

正如 +Volatility 和你自己提到的,集合是没有顺序的。如果你想要集合里的元素按顺序排列,只需要对这个集合使用 sorted 函数就可以了:

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

作为一种无序集合类型,set([8, 1, 6])set([1, 6, 8]) 是一样的。

虽然把集合里的内容按顺序显示可能看起来更好,但这样做会让 repr() 的调用变得更复杂,耗时更多。

在内部,set 类型是通过哈希表来实现的:它使用哈希函数把元素分到多个桶里,这样可以减少检查某个元素是否在集合中的比较次数。

生成 repr() 输出时,它只是依次输出每个桶里的元素,这样的顺序通常不会是排序后的顺序。

74

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

如果你想对集合里的元素进行排序,可以简单地执行:

sorted(set(y))

这样会生成一个包含集合元素的排序列表。(注意,这不是一个集合。再次强调,集合是无序的。)

除此之外,set唯一能保证的就是它会让元素变得唯一(也就是说,里面的元素不会重复出现)。

希望这对你有帮助!

撰写回答