
Sorted – zwraca nową posortowaną listę z iterowalnego obiektu
Porządkowanie danych to jedna z tych czynności, które wydają się banalne dopóki nie trzeba zrobić tego dobrze, szybko i bez utraty informacji. Sortowanie pojawia się przy analizie logów, wyników pomiarów, list użytkowników, raportów finansowych i zwykłych danych wejściowych w programie. W Pythonie najwygodniejszym narzędziem do tego celu jest funkcja wbudowana, która nie modyfikuje źródła danych i daje przewidywalny wynik: Sorted.
Spis Treści
Sorted – zwraca nową posortowaną listę z iterowalnego obiektu i dlaczego różni się od metody sort stosowanej na listach
W Pythonie istnieją dwa podstawowe sposoby sortowania: funkcja sorted() oraz metoda .sort() dostępna dla list. Różnica nie jest kosmetyczna – wpływa na bezpieczeństwo danych, czytelność kodu i późniejsze błędy logiczne.
sorted() działa na dowolnym obiekcie iterowalnym. Oznacza to, że można przekazać nie tylko listę, ale też krotkę, zbiór, napis, generator czy wynik funkcji range().
Najważniejsza cecha: funkcja zwraca nową listę. Oryginalne dane pozostają bez zmian.
To ma praktyczne znaczenie. Jeśli sortujemy dane wejściowe używane później w innej części programu, nadpisanie ich może prowadzić do trudnych do wykrycia błędów. W systemach raportowych albo przy analizie danych takie pomyłki kosztują czas, a czasem także pieniądze.
Metoda .sort() działa tylko na liście i modyfikuje ją „w miejscu”, czyli bez tworzenia nowego obiektu.
Tabela porównawcza:
| Cecha | sorted() | .sort() |
|---|---|---|
| Typ działania | funkcja wbudowana | metoda listy |
| Obsługiwane typy | każdy obiekt iterowalny | tylko lista |
| Zwracana wartość | nowa lista | None |
| Modyfikacja oryginału | nie | tak |
| Bezpieczeństwo danych wejściowych | wyższe | niższe |
Przykład różnicy:
| Python |
|---|
| „`python |
| liczby = [5, 2, 9, 1] |
wynik = sorted(liczby)
print(liczby)
print(wynik)
Wynik:
| Oryginał | Wynik sortowania |
|---|---|
[5, 2, 9, 1] | [1, 2, 5, 9] |
Dla porównania:
| Python |
|—|
| „`python
liczby = [5, 2, 9, 1]
liczby.sort()
print(liczby)
Tutaj oryginalna lista zostaje zmieniona.
To jest jedna z najczęstszych pułapek początkujących: zapis `nowa = lista.sort()` daje `None`, bo metoda nie zwraca nowej listy.
## Parametry funkcji oraz mechanizm działania Sorted – zwraca nową posortowaną listę z iterowalnego obiektu w praktyce codziennego kodu
Funkcja przyjmuje trzy najważniejsze elementy:
| Składnia |
|---|
| `sorted(iterable, key=None, reverse=False)` |
Znaczenie parametrów:
| Parametr | Znaczenie |
|---|---|
| `iterable` | obiekt iterowalny do posortowania |
| `key` | funkcja określająca kryterium sortowania |
| `reverse` | jeśli `True`, sortowanie malejące |
### Sortowanie podstawowe liczb i tekstu
Domyślnie liczby są sortowane rosnąco, a napisy leksykograficznie według kodów znaków Unicode.
| Python |
|---|
| ```python
print(sorted([8, 3, 1, 7]))
print(sorted(["kot", "ala", "pies"]))|
Wynik:
| Liczby | Napisy |
|---|---|
[1, 3, 7, 8] | ['ala', 'kot', 'pies'] |
W przypadku napisów wielkość liter ma znaczenie:
| Python |
|—|
| „`python
print(sorted([„Zenon”, „adam”, „Beata”]))
Duże litery są porównywane inaczej niż małe, więc wynik może być nieintuicyjny.
### Parametr `reverse`
Sortowanie malejące:
| Python |
|---|
| ```python
oceny = [3, 5, 2, 4]
print(sorted(oceny, reverse=True))|
Wynik:
| Wynik |
|---|
[5, 4, 3, 2] |
Parametr key
To najważniejsza część praktycznego użycia.
key nie zmienia danych – wskazuje tylko, według czego mają być porównywane.
Przykład: sortowanie napisów według długości.
| Python |
|—|
| „`python
slowa = [„informatyka”, „kod”, „algorytm”, „CPU”]
print(sorted(slowa, key=len))
Tutaj porównywana jest długość, nie treść.
### Sortowanie słowników i rekordów
To bardzo częsty przypadek w pracy z danymi.
| Python |
|---|
| ```python
studenci = [
{"imie": "Anna", "punkty": 82},
{"imie": "Jan", "punkty": 91},
{"imie": "Ola", "punkty": 75}
]
wynik = sorted(studenci, key=lambda x: x["punkty"], reverse=True)
print(wynik)|
Sortowanie po konkretnym polu jest standardem w raportach, API i przetwarzaniu danych biznesowych.
Stabilność sortowania
Python używa algorytmu Timsort. Jest stabilny, czyli elementy o tym samym kluczu zachowują wcześniejszą kolejność.
To ważne przy sortowaniu wieloetapowym, np. najpierw po nazwisku, potem po wieku.
Bez stabilności wynik mógłby być nieprzewidywalny.
Wydajność, złożoność obliczeniowa i przypadki użycia Sorted – zwraca nową posortowaną listę z iterowalnego obiektu przy większych zbiorach danych
Dla większości przypadków złożoność czasowa wynosi:
| Wzór |
|---|
O(n log n) |
gdzie:
| Symbol | Znaczenie |
|---|---|
n | liczba elementów |
Przy 10 elementach różnica jest niezauważalna. Przy 1 000 000 rekordów już nie.
Python stosuje Timsort – hybrydę merge sort i insertion sort. Algorytm został zaprojektowany specjalnie do danych rzeczywistych, które często są częściowo uporządkowane.
Dlatego w praktyce działa szybciej niż „czyste” algorytmy teoretyczne.
Porównanie z C i C++
Python ukrywa szczegóły implementacyjne, ale warto znać odpowiedniki.
C – qsort
| C |
|—|
| „`c
include
include
int porownaj(const void *a, const void *b)
{
return ((int)a – (int)b);
}
int main()
{
int liczby[] = {5, 2, 9, 1};
int n = 4;
qsort(liczby, n, sizeof(int), porownaj);
for(int i = 0; i < n; i++)
printf("%d ", liczby[i]);
return 0;}
Tutaj trzeba samodzielnie napisać funkcję porównującą.
### C++ — `sort`
| C++ |
|---|
| ```cpp
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int liczby[] = {5, 2, 9, 1};
sort(liczby, liczby + 4);
for(int i = 0; i < 4; i++)
cout << liczby[i] << " ";
return 0;
}|
C++ daje większą kontrolę i zwykle wyższą wydajność, ale Python wygrywa prostotą oraz czytelnością.
Zużycie pamięci
Ponieważ funkcja tworzy nową listę, potrzebna jest dodatkowa pamięć.
Dla bardzo dużych zbiorów danych może to być problem. Jeśli lista ma kilka milionów rekordów, kopia może oznaczać setki megabajtów więcej.
Wtedy czasem lepiej użyć .sort() i świadomie zaakceptować modyfikację oryginału.
Typowe błędy, nieoczywiste zachowania i rzeczy, na które naprawdę warto uważać podczas sortowania danych
Błąd z None
Najczęstszy przypadek:
| Python |
|—|
| „`python
liczby = [3, 1, 2]
wynik = liczby.sort()
print(wynik)
Wynik:
| Rezultat |
|---|
| `None` |
To nie jest awaria — tak działa metoda.
### Mieszanie nieporównywalnych typów
| Python |
|---|
| ```python
print(sorted([1, "abc", 3]))|
W nowoczesnym Pythonie zakończy się to błędem TypeError, ponieważ liczby i napisy nie mają naturalnego porządku porównania.
Sortowanie zbiorów
Zbiór (set) nie zachowuje kolejności. Po sortowaniu zawsze otrzymujemy listę.
| Python |
|—|
| „`python
dane = {4, 1, 7, 2}
print(sorted(dane))
### `key=str.lower` dla tekstu
Jeśli sortujemy napisy niezależnie od wielkości liter:
| Python |
|---|
| ```python
nazwy = ["Zenon", "adam", "Beata"]
print(sorted(nazwy, key=str.lower))|
To daje wynik bardziej naturalny dla użytkownika.
Lambda kontra funkcje nazwane
Dla prostych przypadków lambda jest wygodna, ale przy bardziej złożonej logice lepiej użyć zwykłej funkcji. Kod staje się czytelniejszy i łatwiejszy do testowania.
Zbyt rozbudowane lambda są częstym źródłem chaosu.
FAQ
Czy funkcja działa tylko na listach?
Nie. Można przekazać każdy obiekt iterowalny: listę, krotkę, zbiór, napis, generator, wynik range() i wiele innych.
Dlaczego wynik zawsze jest listą?
Taka jest definicja funkcji. Nawet jeśli wejściem jest krotka lub zbiór, wynik zostaje zwrócony jako lista.
Kiedy lepiej użyć .sort() zamiast sorted()?
Gdy pracujemy na dużej liście i nie potrzebujemy zachować oryginalnej kolejności, a dodatkowe zużycie pamięci byłoby problemem.
Czy można sortować po kilku kryteriach jednocześnie?
Tak. Najczęściej używa się krotki jako klucza.
| Python |
|—|
| python wynik = sorted(dane, key=lambda x: (x["nazwisko"], x["wiek"])) |
Najpierw porównywane jest nazwisko, potem wiek.
Czy sortowanie w Pythonie jest stabilne?
Tak. Python używa stabilnego algorytmu Timsort, więc elementy o tym samym kluczu zachowują poprzednią kolejność.
Czy reverse=True jest tym samym co odwrócenie listy po sortowaniu?
Końcowy efekt często wygląda podobnie, ale semantycznie to nadal sortowanie malejące, a nie zwykłe odwrócenie aktualnej kolejności.
Krótkie zamknięcie tematu z perspektywy codziennej pracy programisty
Dobrze wykonane sortowanie nie jest detalem kosmetycznym. Od niego zależy poprawność raportów, kolejność przetwarzania danych i często zwykła czytelność wyników dla człowieka. W praktyce najbezpieczniejsze jest używanie funkcji, która nie niszczy danych wejściowych i pozwala jasno określić kryterium porównania. Im wcześniej ten nawyk się pojawi, tym mniej czasu później traci się na szukanie błędów, które „przecież nie powinny się wydarzyć”.
Źródło Foto: Freepik


