Эмуляция Tuple Sort вроде Sqlite3 в Python - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь отсортировать список кортежей, где есть определенные индексы кортежей, которые содержат None. В этом случае кортежам с None в указанном c расположении индекса нужно дать приоритет над другими не-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 - это список, в котором есть список порядка индекса, по которому необходимо сортировать список кортежей. Но в этом методе Nones случайно помещаются в список. Мой текущий результат выглядит следующим образом: где 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 и изменить применяемую функцию в моем случае использования, но у меня тоже проблемы с этим ..

1 Ответ

0 голосов
/ 06 марта 2020

Вы можете добавить пользовательский ключ, считая 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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...