Dokumentacja nie gwarantuje. Czy jest jakieś inne miejsce, które jest udokumentowane?
Domyślam się, że może być stabilna, ponieważ metoda sortowania na listach jest gwarantowana jako stabilna (Uwagi 9 punkt: „Począwszy od Pythona 2.3, metoda sort () jest stabilna”), a sortowanie jest funkcjonalnie podobne. Jednak nie jestem w stanie znaleźć żadnego ostatecznego źródła, które by to mówiło.
Cel: muszę sortować na podstawie klucza podstawowego, a także klucza pomocniczego w przypadkach, gdy klucz podstawowy jest taki sam w obu rekordach. Jeśli gwarantujemy, że funkcja sortowania () jest stabilna, mogę posortować dane według klucza dodatkowego, a następnie posortować dane według klucza podstawowego i uzyskać wynik, którego potrzebuję.
PS: Aby uniknąć nieporozumień, używam stabilnego w znaczeniu „sort jest stabilny, jeśli gwarantuje, że nie zmieni się względnej kolejności elementów, które porównują równe sobie”.
źródło
sorted([(1, 2), (1, 1)])
zwraca[(1, 1), (1, 2)]
zamiast zwracać oryginalne dane wejściowe w tej samej kolejności / kolejności. Czy gwarancja stabilności nie powinna oznaczać, że powinna zwracać oryginalne[(1, 2), (1, 1)]
dane wejściowe? W takim przypadku musisz być wyraźny i powiedziećsorted([(1, 2), (1, 1)], key=lambda t: t[0])
key
jawnie przekazać parametr.Są stabilne .
Przy okazji: czasami możesz zignorować wiedzę, czy sortowanie i sortowanie są stabilne, łącząc sortowanie wieloprzebiegowe z sortowaniem jednoprzebiegowym.
Na przykład, jeśli chcesz rodzaju obiektów na podstawie ich
last_name
,first_name
atrybutów, można to zrobić w jednym przebiegu:sorted_list= sorted( your_sequence_of_items, key= lambda item: (item.last_name, item.first_name))
korzystając z porównania krotek.
Ta odpowiedź, jak jest, obejmuje pierwotne pytanie. Więcej pytań związanych z sortowaniem można znaleźć w poradniku na temat sortowania w Pythonie .
źródło
key= lambda item: (-item.rating, item.price)
lub podajcmp
zamiastkey
argumentu. Jednak nadal nie jestem pewien, jaki jest cel Twojego komentarza.Dokumentacja zmieniona w międzyczasie ( odpowiednie zobowiązanie ), a obecna dokumentacja
sorted
wyraźnie to gwarantuje:Ta część dokumentacji została dodana do Pythona 2.7 i Pythona 3.4 (+), więc każda zgodna implementacja tej wersji językowej powinna mieć stabilną wersję
sorted
.Zauważ, że w przypadku CPython
list.sort
był stabilny od czasu Pythona 2.3Nie jestem pewien w 100%
sorted
, obecnie jest to proste użycielist.sort
, ale nie sprawdzałem historii. Ale jest prawdopodobne, że był używany „zawsze”list.sort
.źródło
Dokumentacja „Co nowego” dla Pythona 2.4 skutecznie wskazuje, że sort () najpierw tworzy listę, a następnie wywołuje na niej sort (), zapewniając gwarancję, której potrzebujesz, chociaż nie ma jej w „oficjalnych” dokumentach. Jeśli naprawdę się martwisz, możesz po prostu sprawdzić źródło.
źródło
Dokument Python 3.6 dotyczący sortowania stwierdza teraz, że
Ponadto w dokumencie tym znajduje się odsyłacz do stabilnego Timsort , który to stwierdza
źródło