Historia pytania:
Metoda sort() jest wbudowana w typ list od pierwszych wersji Pythona, a funkcja sorted() pojawiła się w Pythonie 2.4. Sortowanie kolekcji to jedno z najczęstszych zadań w programowaniu, a Python oferuje dwa główne narzędzia do jego rozwiązania.
Problem:
Wielu początkujących myli sort() (metodę listy) i sorted() (funkcję wyższego poziomu). Brakuje zrozumienia, kiedy używać sortowania in-place, jakie obiekty można sortować, jak ustawiać dowolny porządek za pomocą key/reverse, do jakich możliwych pułapek to prowadzi, szczególnie dla złożonych struktur użytkowych.
Rozwiązanie:
list.sort() sortuje oryginalną listę na miejscu i zwraca None. Zmienia oryginalny obiekt.sorted() zwraca nową posortowaną listę (lub inny typ, jeśli przekażesz inny), nie zmieniając oryginału. Działa z dowolnymi obiektami iterowalnymi (nawet z generatorami).key (funkcja sortowania) oraz reverse (flaga logiczna do sortowania w odwrotnej kolejności).Przykład kodu:
numbers = [5, 2, 9, 1] numbers.sort() # numbers = [1, 2, 5, 9] words = ['aaa', 'ZZZ', 'bbb'] sorted_words = sorted(words, key=str.lower, reverse=True) # sorted_words = ['ZZZ', 'bbb', 'aaa'] # words pozostaje niezmienione
Kluczowe cechy:
sort() działa tylko dla list i sortuje in-place (na miejscu), sorted() jest bardziej uniwersalny — działa z każdym obiektem iterowalnym.Co zwróci zmienna, jeśli zrobisz my_list = my_list.sort()?
Odpowiedź: my_list będzie None, ponieważ sort sortuje listę na miejscu i zwraca None. To powszechny błąd: zawsze sortuj in-place bez przypisania, albo użyj sorted, jeśli chcesz posortowany obiekt jako nową listę.
Przykład kodu:
lst = [3, 1, 2] lst = lst.sort() # lst teraz None
Czy można posortować krotkę lub napis metodą sort()?
Odpowiedź: Nie, obiekty niemutowalne (tuple, str) nie mają metody sort, ale można do nich zastosować sorted(), który zwraca nową posortowaną listę z elementów.
Przykład kodu:
tpl = (4, 2, 7) sorted_tpl = sorted(tpl) # sorted_tpl = [2, 4, 7]
Czy można posortować listę z elementami różnych typów?
Odpowiedź: W Pythonie 3 sortowanie różnych, nieporównywalnych typów (na przykład int i str) prowadzi do TypeError. W Pythonie 2 był specyficzny porządek, teraz należy wyraźnie określić funkcję key, aby uogólnić wszystkie wartości w porównywalną formę.
Negatywny przypadek
Programista zrobił my_list = my_list.sort(), po czym utracił dostęp do oryginalnej listy, ponieważ zmiennej przypisano wartość None.
Zalety:
Wady:
Pozytywny przypadek
Użyto starannego sorted() do uzyskania nowej wersji bez zmiany oryginału lub poprawnie zastosowano sort, nie dokonując przypisania.
Zalety:
Wady: