为什么set()在Python中表现得如此不直观?

  • 本文关键字:直观 set Python 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}

如果我在list 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中的set类型是不是显式排序的。它可以根据实现看起来是有序的,但不能保证如此。如果你需要一个有序的表示,你应该使用像sorted(set(input_sequence))这样的东西,它会在删除重复项后返回一个有序的列表。请注意,如果没有某种自定义比较器,则不支持对具有不可比较类型的列表进行排序(因此您无法对['a', 1]进行开箱排序)。

最新更新