在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是它使元素唯一(没有任何东西会存在多次).
希望这可以帮助!
Jam*_*dge 14
作为无序集合类型,set([8, 1, 6])相当于set([1, 6, 8]).
虽然以排序顺序显示设置内容可能更好,但这会使repr()通话更加昂贵.
在内部,set类型是使用哈希表实现的:哈希函数用于将项目分成多个桶,以减少检查项目是否是集合的一部分所需的相等操作的数量.
为了产生repr()输出,它只是依次输出每个桶中的项目,这不太可能是排序顺序.
正如+ Volatility和你自己指出的那样,集合是无序的.如果您需要按顺序排列元素,只需调用sorted集合:
>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> sorted(set(y))
[1, 6, 8]
Run Code Online (Sandbox Code Playgroud)
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)
这是依赖于实现的,因此您不应该依赖它.
| 归档时间: |
|
| 查看次数: |
142444 次 |
| 最近记录: |