programowanieProgramista Python

Jak działa funkcja sorted() w Pythonie, czym różni się od metody sort() dla list, jakie są niuanse przy użyciu klucza key i parametru reverse?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

Historia pytania:

Od samego początku język Python dostarczał wbudowanych narzędzi do sortowania kolekcji. Metody sort() i funkcja sorted() pojawiły się w drugiej wersji Pythona, ale od wersji Python 2.4, sorted() została wprowadzona jako uniwersalne narzędzie do sortowania dowolnych obiektów iterowalnych (nie tylko list).

Problem:

Często zachodzi potrzeba sortowania danych według różnych kryteriów i nie zawsze chce się zmieniać oryginalny obiekt. Nowicjusze mylą sort() i sorted(), nie rozumieją, gdzie zastosować każdy z nich, i popełniają błędy z kluczem sortowania i odwrotną kolejnością.

Rozwiązanie:

  • sorted(obiekt_iterowalny, key=None, reverse=False) zawsze zwraca nowy obiekt listy, nie zmieniając oryginału.
  • list.sort(key=None, reverse=False) sortuje samą listę na miejscu (in-place) i zwraca None.
  • Parametr key to funkcja, która określa, według jakiego kryterium sortować.
  • reverse=True zmienia kolejność na odwrotną.

Przykład sortowania listy napisów według ich długości, w odwrotnej kolejności:

words = ['python', 'is', 'strong', 'language'] sorted_words = sorted(words, key=len, reverse=True) print(sorted_words) # ['language', 'python', 'strong', 'is']

Kluczowe cechy:

  • sorted() zawsze zwraca nową listę, nie dotykając źródła
  • sort() działa tylko z samą listą, nie zwraca nowego obiektu
  • opcja key może być dowolną funkcją, która zwraca wartości do porównania

Pytania z pułapką.

Co zwraca metoda sort()?

Metoda list.sort() sortuje samą listę i zawsze zwraca None, co często bywa zapominane.

lst = [3, 1, 2] res = lst.sort() print(res) # None print(lst) # [1, 2, 3]

Czy można posortować krotkę za pomocą sort()?

Nie, krotki są niemutowalne, nie mają metody .sort(). Do sortowania użyj sorted().

tuple_data = (5,2,3) sorted_tuple = sorted(tuple_data) print(sorted_tuple) # [2, 3, 5]

Co się stanie, jeśli w key poda się funkcję zwracającą różne typy?

Pojawi się wyjątek TypeError, jeśli zwracane wartości będą między sobą nieporównywalne (na przykład, int i str).

Typowe błędy i antywzorce

  • Używać sort(), oczekując nowej posortowanej listy
  • Próbować sortować niemutowalny obiekt metodą sort()
  • Podawać w key funkcję, która zwraca wartości z różnorodnymi typami

Przykład z życia

Negatywny przypadek

Na rozmowie kwalifikacyjnej proszą o zwrócenie posortowanej według długości listy, a kandydat robi:

lst = ['one', 'elephant'] ans = lst.sort(key=len) print(ans) # None

Zalety:

  • Zmienia listę na miejscu (czasami oszczędza pamięć)

Wady:

  • Zwraca None, co psuje dalszą logikę

Pozytywny przypadek

Poprawne użycie:

lst = ['one', 'elephant'] ans = sorted(lst, key=len) print(ans) # ['one', 'elephant']

Zalety:

  • Oryginalna lista nie jest zmieniana
  • Otrzymujemy oczekiwany wynik

Wady:

  • Zajmuje dodatkową pamięć na nową listę