理解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 个回答
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
唯一能保证的就是它会让元素变得唯一(也就是说,里面的元素不会重复出现)。
希望这对你有帮助!