Функция сортировки () python гарантированно стабильна?
The документация не гарантирует. Есть ли другое место, где это задокументировано?
Я предполагаю, что это может быть стабильным, так как метод сортировки в списках гарантированная стабильность (Примечания 9-й пункт:" начиная с Python 2.3, метод sort() гарантированно будет стабильным"), а сортировка функционально аналогична. Однако я не могу найти какой-либо определенный источник, который говорит об этом.
цель: мне нужно сортировать на основе первичных ключ и вторичный ключ в тех случаях, когда первичный ключ равен в обеих записей. Если sorted () гарантированно будет стабильным, я могу сортировать по вторичному ключу, а затем сортировать по первичному ключу и получать нужный мне результат.
PS: чтобы избежать путаницы, я использую stable в смысле "вид стабилен, если он гарантирует не изменять относительный порядок элементов, которые сравниваются равными".
5 ответов:
да, намерение руководства состоит в том, чтобы гарантировать, что
sorted
стабильная и действительно, что он использует точно такой же алгоритм какsort
метод. Я понимаю, что документы не на 100% ясны об этой идентичности; патчи doc всегда с радостью принимаются!
Они стабильный.
кстати: иногда вы можете игнорировать знание того, являются ли сортировка и сортировка стабильными, комбинируя многопроходную сортировку в однопроходной.
например, если вы хотите сортировать объекты на основе их
last_name
,first_name
атрибуты, вы можете сделать это в один проход:sorted_list= sorted( your_sequence_of_items, key= lambda item: (item.last_name, item.first_name))
используя преимущества сравнения кортежей.
этот ответ, как есть, охватывает исходный вопрос. Для дальнейшей сортировки вопросов, там есть Python Сортировка How-To.
документация изменилась в то же время (соответствующих совершения) и текущей документации
sorted
явно гарантирует это:встроенный
sorted()
функция гарантированно будет стабильным. Сортировка является стабильной, если она гарантирует не изменять относительный порядок элементов, которые сравниваются равными - это полезно для сортировки в несколько проходов (например, сортировать по отделу, а затем по классу зарплаты).этот часть документации была добавлена в Python 2.7 и Python 3.4 (+), так что все совместимость реализация этой языковой версии должна есть стабильной
sorted
.обратите внимание, что для CPython
list.sort
был стабилен с Python 2.3
- Тим Питерс переписал его
list.sort()
реализация-это "стабильная сортировка" (равные входы появляются в том же порядке на выходе) и быстрее, чем до.Я не уверен на 100%
sorted
, в настоящее время он просто используетlist.sort
, но я не проверял историю для этого. Но вполне вероятно, что он" всегда " использовалlist.sort
.
The "Что нового" документы для Python 2.4 фактически сделайте так, чтобы sorted() сначала создавал список, а затем вызывал sort() на нем, предоставляя вам необходимую гарантию, хотя и не в "официальных" документах. Вы также можете просто проверить источник, если вы действительно обеспокоены.
Python 3.6 doc при сортировке теперь утверждает, что
сортировка гарантированно будет стабильной
кроме того, в этом документе есть ссылка на стабильный Timsort, где указано, что
Timsort был стандартным алгоритмом сортировки Python с версии 2.3