首页 > 解决方案 > 为什么 set() 在 Python 中表现得如此不直观?

问题描述

我不明白为什么 set() 以它的方式工作......

假设我们有两个列表:

a = [1,2,-1,20,6,210,1, -11.4, 2]
b = [1,2,-1,20,6,210,1,-11.4, 2, "a"]

当我在数字列表 a 上运行 set() 时,我得到一组从最小到最大排序的唯一数字。好的,这看起来很直观!尚未发现任何异常:

set(a)
Out: {-11.4, -1, 1, 2, 6, 20, 210}

如果我在列表 b 中加入一个字符会怎样?怪异。底片无序,6 也无序。

set(b)
Out: {-1, -11.4, 1, 2, 20, 210, 6, 'a'}

不过情况会变得更糟。如果我尝试将这些集合转回列表怎么办?纯粹的混乱。

list(set(a))
Out: [1, 2, 6, 210, 20, -11.4, -1]

list(set(b))
Out: [1, 2, 6, 'a', 210, 20, -11.4, -1]

如您所见,这些列表确实只有唯一值。但未能保留原始列表的顺序。

这里发生了什么,为什么?

标签: python

解决方案


setpython 中的类型没有明确排序。它可以根据实现排序,但不能保证如此。如果你需要一个有序的表示,你应该使用类似的东西sorted(set(input_sequence)),它会在删除重复项后返回一个排序列表。请注意,如果没有某种自定义比较器,则不支持具有不可比较类型的排序列表(因此您无法['a', 1]开箱即用地进行排序)。


推荐阅读