python - 在 Python 中模拟像 Sqlite3 这样的元组排序
问题描述
我正在尝试对包含 None 的某些元组索引的元组列表进行排序。在这种情况下,特定索引位置中具有 None 的元组需要优先于元组列表中的其他非 None 值。
例如,如果我有一个如下所示的列表:
[
(3.4, 43, None),
(5345.6, 42, None),
(43.24, 25, None),
(323.4, 433, None),
(5.6, 42, None),
(4.4, 235, None),
(None, None, 'Hello'),
(5.6, None, None),
(None, 235, None),
]
我希望我的最终列表看起来像(基本上是在做一个“SELECT * FROM table ORDER BY column1,column3;”)
[
(None, 235, None),
(None, None, 'Hello'),
(3.4, 43, None),
(4.4, 235, None),
(5.6, 42, None),
(5.6, None, None),
(43.24, 25, None),
(323.4, 433, None),
(5345.6, 42, None),
]
截至目前,我目前正在使用
sortedSelectedResult = sorted(selectedResult,key=itemgetter(*indexSortOrderList))
其中 indexSortOrderList 是一个列表,其中包含需要对元组列表进行排序的索引顺序列表。但是在这种方法中,无对象是随机放置在列表中的。我当前的结果如下所示,其中 indexSortOrder = [0,2] (即)按第一列排序,然后是第三列:
[(3.4, 43, None),
(5345.6, 42, None),
(43.24, 25, None),
(323.4, 433, None),
(5.6, 42, None),
(4.4, 235, None),
(None, None, 'Hello'),
(5.6, None, None),
(None, 235, None)]
我尝试查看 operator.itemgetter 并修改函数以应用于我的用例,但我也遇到了麻烦。
解决方案
您可以添加一个自定义键,考虑None
为 0:
sorted(lst, key=lambda x: (isinstance(x[0], str), x[0] or 0, isinstance(x[2], str) or x[2] or 0))
代码:
lst = [
(3.4, 43, None),
(5345.6, 42, None),
(43.24, 25, None),
(323.4, 433, None),
(5.6, 42, None),
(4.4, 235, None),
(None, None, 'hello'),
(5.6, None, None),
(None, 235, None),
]
print(sorted(lst, key=lambda x: (isinstance(x[0], str), x[0] or 0, isinstance(x[2], str) or x[2] or 0)))
# [(None, 235, None),
# (None, None, 'hello'),
# (3.4, 43, None),
# (4.4, 235, None),
# (5.6, 42, None),
# (5.6, None, None),
# (43.24, 25, None),
# (323.4, 433, None),
# (5345.6, 42, None)]
推荐阅读
- javascript - 带逻辑运算符的三元运算符
- python - 我正在尝试跳过断言错误python中的某些情况
- java - 在 Android 10 (API 29) 升级后 setColor 不起作用
- regex - Flutter Dart:从字符串中提取 URL 的正则表达式
- node.js - 跨域设置cookies?节点和反应
- asp.net-core - 启动时加载资产文件失败,文件不存在
- pandas - 创建一个函数以从 pandas 中的数据框计算方程
- c++ - 没有重复的背包:最大数量的金币
- database - FSA 的 NoSQL 数据库设计
- javascript - 如何在进度条上悬停时生成视频缩略图并预览它们?