理解set()函数

Pra*_*tra 56 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])
Run Code Online (Sandbox Code Playgroud)

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

use*_*ser 70

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

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

sorted(set(y))
Run Code Online (Sandbox Code Playgroud)

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

否则,唯一保证的set是它使元素唯一(没有任何东西会存在多次).

希望这可以帮助!

  • 注意:通常可以使用树来实现集合.Python中的`set`不能(有意义),因为它保证它们要求项目可以清洗,并且不要求它们具有可比性. (2认同)

Jam*_*dge 14

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

虽然以排序顺序显示设置内容可能更好,但这会使repr()通话更加昂贵.

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

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


I82*_*uch 7

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

>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> sorted(set(y))
[1, 6, 8]
Run Code Online (Sandbox Code Playgroud)


Blc*_*ght 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}
Run Code Online (Sandbox Code Playgroud)

这是依赖于实现的,因此您不应该依赖它.