在Python中模拟类似Sqlite3的元组排序
我试图对元组列表进行排序,其中某些元组索引不包含任何元组索引。在这种情况下,特定索引位置中无的元组需要优先于元组列表中的其他非无值 例如,如果我有一个如下所示的列表:在Python中模拟类似Sqlite3的元组排序,python,sqlite,sorting,Python,Sqlite,Sorting,我试图对元组列表进行排序,其中某些元组索引不包含任何元组索引。在这种情况下,特定索引位置中无的元组需要优先于元组列表中的其他非无值 例如,如果我有一个如下所示的列表: [ (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,
[
(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),
]
我希望我的最终清单是这样的
(基本上是“按第1列、第3列从表顺序选择*”)
现在,我正在使用
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并修改函数以应用于我的用例,
但是我也遇到了问题。您可以添加一个自定义键,将
无
视为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)]
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)]