Документация не гарантирует , что. Есть ли другое место, где это задокументировано?
Я предполагаю, что он может быть стабильным, так как метод sort в списках гарантированно стабилен (примечания 9 пункт: «Начиная с Python 2.3, метод sort () гарантированно стабилен»), а sorted функционально аналогичен. Однако я не могу найти какой-либо исчерпывающий источник, в котором говорится об этом.
Цель: мне нужно выполнить сортировку на основе первичного ключа, а также вторичного ключа в тех случаях, когда первичный ключ одинаков в обеих записях. Если sorted () гарантированно будет стабильным, я могу отсортировать по вторичному ключу, затем отсортировать по первичному ключу и получить нужный мне результат.
PS: Чтобы избежать путаницы, я использую стабильный в смысле «сортировка стабильна, если она гарантирует, что не изменит относительный порядок элементов, которые сравниваются равными».
источник
sorted([(1, 2), (1, 1)])
возвращает[(1, 1), (1, 2)]
вместо исходного ввода в той же последовательности / порядке. Разве гарантия стабильности не должна означать, что он должен возвращать исходный[(1, 2), (1, 1)]
ввод? В этом случае вы должны быть явным и сказатьsorted([(1, 2), (1, 1)], key=lambda t: t[0])
key
явно передать параметр.Они стабильны .
Кстати: иногда вы можете игнорировать знание того, стабильны ли сортировка и сортировка, комбинируя многопроходную сортировку с однопроходной.
Например, если вы хотите , чтобы отсортировать объекты на основе их
last_name
,first_name
атрибутов, вы можете сделать это за один проход:sorted_list= sorted( your_sequence_of_items, key= lambda item: (item.last_name, item.first_name))
пользуясь преимуществом сравнения кортежей.
Этот ответ как есть охватывает исходный вопрос. Для дальнейших вопросов, связанных с сортировкой, есть руководство по сортировке Python .
источник
key= lambda item: (-item.rating, item.price)
или предоставьтеcmp
вместоkey
аргумента. Однако я до сих пор не уверен в цели вашего комментария.Тем временем документация была изменена ( соответствующий коммит ), и текущая документация
sorted
явно гарантирует это:Эта часть документации была добавлена в Python 2.7 и Python 3.4 (+), поэтому любая совместимая реализация этой языковой версии должна иметь стабильную
sorted
.Обратите внимание, что для CPython
list.sort
он был стабильным с Python 2.3.Я не уверен на 100%
sorted
, в настоящее время он прост в использованииlist.sort
, но я не проверял историю на предмет этого. Но вполне вероятно, что его «всегда» использовалиlist.sort
.источник
Документы «Что нового» для Python 2.4 фактически указывают на то, что sorted () сначала создает список, а затем вызывает для него sort (), предоставляя вам необходимую гарантию, хотя и не в «официальных» документах. Вы также можете просто проверить источник, если вас действительно беспокоит.
источник
В документе Python 3.6 о сортировке теперь говорится, что
Кроме того, в этом документе есть ссылка на стабильную версию Timsort , в которой говорится, что
источник