python - 为什么 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]
如您所见,这些列表确实只有唯一值。但未能保留原始列表的顺序。
这里发生了什么,为什么?
解决方案
set
python 中的类型没有明确排序。它可以根据实现排序,但不能保证如此。如果你需要一个有序的表示,你应该使用类似的东西sorted(set(input_sequence))
,它会在删除重复项后返回一个排序列表。请注意,如果没有某种自定义比较器,则不支持具有不可比较类型的排序列表(因此您无法['a', 1]
开箱即用地进行排序)。
推荐阅读
- excel - 2 ListBox 在一个用户窗体上,选择下一个索引
- regex - git commit 消息中的 JIRA id 验证
- autodesk-forge - 如何将模型衍生api(node.js)与angular 4集成?
- slack - 如何在 Slack 模态中显示有关非输入块的验证错误
- css - react-transition-group 使用 flex-box 进行 react-router 转换
- javascript - 如何一次从多个 url 获取数据?
- spfx - 一个 SPFx Web 部件可以使用多个 scss 吗?
- c# - 新虚拟助手模板中 OnEventActivityAsync() 的替代方案
- javascript - Sequelize:从迁移生成模型时,create 不是函数
- html - 如何创建图像和标签的并排布局?