首页 > 解决方案 > 在 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 并修改函数以应用于我的用例,但我也遇到了麻烦。

标签: pythonsqlitesorting

解决方案


您可以添加一个自定义键,考虑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)]

推荐阅读