С python's sort
is stable for versions after 2.2 (или perhaps 2.3), самой простой реализацией, я думаю, является последовательным повторением sort
с использованием ряда index, reverse_value
кортежей:
# Specify the index, and whether reverse should be True/False
sort_spec = ((0, True), (1, False), (2, False), (3, True))
# Sort repeatedly from last tuple to the first, to have final output be
# sorted by first tuple, and ties sorted by second tuple etc
for index, reverse_value in sort_spec[::-1]:
list_of_tuples.sort(key = lambda x: x[index], reverse=reverse_value)
Это делает несколько проходов, поэтому может быть неэффективным с точки зрения постоянной стоимости времени, но все же O (nlogn) с точки зрения асимптотической сложности.
Если порядок сортировки индексов действительно равен 0, 1... n-1, n
для списка кортежей n-размера, как показано в вашем примере, тогда вам потребуется только последовательность True и False, чтобы указать, хотите ли вы reverse
или нет, и вы можете используйте enumerate
, чтобы добавить индекс.
sort_spec = (True, False, False, True)
for index, reverse_value in list(enumerate(sort_spec))[::-1]:
list_of_tuples.sort(key = lambda x: x[index], reverse=reverse_value)
В то время как исходный код допускал гибкость сортировки по любому порядку индексов.
Кстати, этот метод «последовательности сортов» рекомендуется в Python Sorting HOWTO с небольшими изменениями.
Редактировать Если у вас не было требование сортировки по возрастанию по некоторым показателям и убывания других, то
from operator import itemgetter
list_of_tuples.sort(key = itemgetter(1, 3, 5))
будет сортировать по индексу 1, то связи будут отсортированы по индексу 3, и дальнейшие связи по индексу 5. Однако изменение восходящего/нисходящего порядка каждого индекса является нетривиальным в один проход.
'list.sort()' должно быть достаточно. – vaultah
Как и было предложено: используйте list.sort(). Попробуйте отсортировать список простых элементов, затем список кортежей первым элементом, затем список кортежей вторым элементом. Объедините свои знания. – dmitri