{"id":1541,"date":"2026-04-09T16:12:59","date_gmt":"2026-04-09T14:12:59","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1541"},"modified":"2026-04-28T16:18:49","modified_gmt":"2026-04-28T14:18:49","slug":"sorted-zwraca-nowa-posortowana-liste-z-iterowalnego-obiektu","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/09\/sorted-zwraca-nowa-posortowana-liste-z-iterowalnego-obiektu\/","title":{"rendered":"Sorted \u2013 zwraca now\u0105 posortowan\u0105 list\u0119 z iterowalnego obiektu"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Porz\u0105dkowanie danych to jedna z tych czynno\u015bci, kt\u00f3re wydaj\u0105 si\u0119 banalne dop\u00f3ki nie trzeba zrobi\u0107 tego dobrze, szybko i bez utraty informacji. Sortowanie pojawia si\u0119 przy analizie log\u00f3w, wynik\u00f3w pomiar\u00f3w, list u\u017cytkownik\u00f3w, raport\u00f3w finansowych i zwyk\u0142ych danych wej\u015bciowych w programie. W Pythonie najwygodniejszym narz\u0119dziem do tego celu jest funkcja wbudowana, kt\u00f3ra nie modyfikuje \u017ar\u00f3d\u0142a danych i daje przewidywalny wynik: Sorted.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li><a href=\"#sorted-zwraca-nowa-posortowana-liste-z-iterowalnego-obiektu-i-dlaczego-rozni-sie-od-metody-sort-stosowanej-na-listach\">Sorted \u2013 zwraca now\u0105 posortowan\u0105 list\u0119 z iterowalnego obiektu i dlaczego r\u00f3\u017cni si\u0119 od metody sort stosowanej na listach<\/a><ol><li><a href=\"#parametr-key\">Parametr key<\/a><\/li><li><a href=\"#stabilnosc-sortowania\">Stabilno\u015b\u0107 sortowania<\/a><\/li><\/ol><\/li><li><a href=\"#wydajnosc-zlozonosc-obliczeniowa-i-przypadki-uzycia-sorted-zwraca-nowa-posortowana-liste-z-iterowalnego-obiektu-przy-wiekszych-zbiorach-danych\">Wydajno\u015b\u0107, z\u0142o\u017cono\u015b\u0107 obliczeniowa i przypadki u\u017cycia Sorted \u2013 zwraca now\u0105 posortowan\u0105 list\u0119 z iterowalnego obiektu przy wi\u0119kszych zbiorach danych<\/a><ol><li><a href=\"#porownanie-z-c-i-c\">Por\u00f3wnanie z C i C++<\/a><\/li><li><a href=\"#c-qsort\">C &#8211; qsort<\/a><\/li><li><a href=\"#zuzycie-pamieci\">Zu\u017cycie pami\u0119ci<\/a><\/li><\/ol><\/li><li><a href=\"#typowe-bledy-nieoczywiste-zachowania-i-rzeczy-na-ktore-naprawde-warto-uwazac-podczas-sortowania-danych\">Typowe b\u0142\u0119dy, nieoczywiste zachowania i rzeczy, na kt\u00f3re naprawd\u0119 warto uwa\u017ca\u0107 podczas sortowania danych<\/a><ol><li><a href=\"#blad-z-none\">B\u0142\u0105d z None<\/a><\/li><li><a href=\"#sortowanie-zbiorow\">Sortowanie zbior\u00f3w<\/a><\/li><li><a href=\"#lambda-kontra-funkcje-nazwane\">Lambda kontra funkcje nazwane<\/a><\/li><\/ol><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#czy-funkcja-dziala-tylko-na-listach\">Czy funkcja dzia\u0142a tylko na listach?<\/a><\/li><li><a href=\"#dlaczego-wynik-zawsze-jest-lista\">Dlaczego wynik zawsze jest list\u0105?<\/a><\/li><li><a href=\"#kiedy-lepiej-uzyc-sort-zamiast-sorted\">Kiedy lepiej u\u017cy\u0107 .sort() zamiast sorted()?<\/a><\/li><li><a href=\"#czy-mozna-sortowac-po-kilku-kryteriach-jednoczesnie\">Czy mo\u017cna sortowa\u0107 po kilku kryteriach jednocze\u015bnie?<\/a><\/li><li><a href=\"#czy-sortowanie-w-pythonie-jest-stabilne\">Czy sortowanie w Pythonie jest stabilne?<\/a><\/li><li><a href=\"#czy-reverse-true-jest-tym-samym-co-odwrocenie-listy-po-sortowaniu\">Czy reverse=True jest tym samym co odwr\u00f3cenie listy po sortowaniu?<\/a><\/li><\/ol><\/li><li><a href=\"#krotkie-zamkniecie-tematu-z-perspektywy-codziennej-pracy-programisty\">Kr\u00f3tkie zamkni\u0119cie tematu z perspektywy codziennej pracy programisty<\/a><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"sorted-zwraca-nowa-posortowana-liste-z-iterowalnego-obiektu-i-dlaczego-rozni-sie-od-metody-sort-stosowanej-na-listach\">Sorted \u2013 zwraca now\u0105 posortowan\u0105 list\u0119 z iterowalnego obiektu i dlaczego r\u00f3\u017cni si\u0119 od metody sort stosowanej na listach<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie istniej\u0105 dwa podstawowe sposoby sortowania: funkcja <code>sorted()<\/code> oraz metoda <code>.sort()<\/code> dost\u0119pna dla list. R\u00f3\u017cnica nie jest kosmetyczna &#8211; wp\u0142ywa na bezpiecze\u0144stwo danych, czytelno\u015b\u0107 kodu i p\u00f3\u017aniejsze b\u0142\u0119dy logiczne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>sorted()<\/code> dzia\u0142a na dowolnym obiekcie iterowalnym. Oznacza to, \u017ce mo\u017cna przekaza\u0107 nie tylko list\u0119, ale te\u017c krotk\u0119, zbi\u00f3r, napis, generator czy wynik funkcji <code>range()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najwa\u017cniejsza cecha: funkcja zwraca now\u0105 list\u0119. Oryginalne dane pozostaj\u0105 bez zmian.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To ma praktyczne znaczenie. Je\u015bli sortujemy dane wej\u015bciowe u\u017cywane p\u00f3\u017aniej w innej cz\u0119\u015bci programu, nadpisanie ich mo\u017ce prowadzi\u0107 do trudnych do wykrycia b\u0142\u0119d\u00f3w. W systemach raportowych albo przy analizie danych takie pomy\u0142ki kosztuj\u0105 czas, a czasem tak\u017ce pieni\u0105dze.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Metoda <code>.sort()<\/code> dzia\u0142a tylko na li\u015bcie i modyfikuje j\u0105 \u201ew miejscu\u201d, czyli bez tworzenia nowego obiektu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tabela por\u00f3wnawcza:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Cecha<\/th><th><code>sorted()<\/code><\/th><th><code>.sort()<\/code><\/th><\/tr><\/thead><tbody><tr><td>Typ dzia\u0142ania<\/td><td>funkcja wbudowana<\/td><td>metoda listy<\/td><\/tr><tr><td>Obs\u0142ugiwane typy<\/td><td>ka\u017cdy obiekt iterowalny<\/td><td>tylko lista<\/td><\/tr><tr><td>Zwracana warto\u015b\u0107<\/td><td>nowa lista<\/td><td><code>None<\/code><\/td><\/tr><tr><td>Modyfikacja orygina\u0142u<\/td><td>nie<\/td><td>tak<\/td><\/tr><tr><td>Bezpiecze\u0144stwo danych wej\u015bciowych<\/td><td>wy\u017csze<\/td><td>ni\u017csze<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad r\u00f3\u017cnicy:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Python<\/th><\/tr><\/thead><tbody><tr><td>&#8222;`python<\/td><\/tr><tr><td>liczby = [5, 2, 9, 1]<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">wynik = sorted(liczby)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">print(liczby)<br>print(wynik)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Orygina\u0142<\/th><th>Wynik sortowania<\/th><\/tr><\/thead><tbody><tr><td><code>[5, 2, 9, 1]<\/code><\/td><td><code>[1, 2, 5, 9]<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dla por\u00f3wnania:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">| Python |<br>|&#8212;|<br>| &#8222;`python<br>liczby = [5, 2, 9, 1]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">liczby.sort()<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">print(liczby)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Tutaj oryginalna lista zostaje zmieniona.\n\nTo jest jedna z najcz\u0119stszych pu\u0142apek pocz\u0105tkuj\u0105cych: zapis `nowa = lista.sort()` daje `None`, bo metoda nie zwraca nowej listy.\n\n## Parametry funkcji oraz mechanizm dzia\u0142ania Sorted \u2013 zwraca now\u0105 posortowan\u0105 list\u0119 z iterowalnego obiektu w praktyce codziennego kodu\n\nFunkcja przyjmuje trzy najwa\u017cniejsze elementy:\n\n| Sk\u0142adnia |\n|---|\n| `sorted(iterable, key=None, reverse=False)` |\n\nZnaczenie parametr\u00f3w:\n\n| Parametr | Znaczenie |\n|---|---|\n| `iterable` | obiekt iterowalny do posortowania |\n| `key` | funkcja okre\u015blaj\u0105ca kryterium sortowania |\n| `reverse` | je\u015bli `True`, sortowanie malej\u0105ce |\n\n### Sortowanie podstawowe liczb i tekstu\n\nDomy\u015blnie liczby s\u0105 sortowane rosn\u0105co, a napisy leksykograficznie wed\u0142ug kod\u00f3w znak\u00f3w Unicode.\n\n| Python |\n|---|\n| ```python\nprint(sorted(&#91;8, 3, 1, 7]))\nprint(sorted(&#91;\"kot\", \"ala\", \"pies\"]))<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">|<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Liczby<\/th><th>Napisy<\/th><\/tr><\/thead><tbody><tr><td><code>[1, 3, 7, 8]<\/code><\/td><td><code>['ala', 'kot', 'pies']<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">W przypadku napis\u00f3w wielko\u015b\u0107 liter ma znaczenie:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">| Python |<br>|&#8212;|<br>| &#8222;`python<br>print(sorted([&#8222;Zenon&#8221;, &#8222;adam&#8221;, &#8222;Beata&#8221;]))<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Du\u017ce litery s\u0105 por\u00f3wnywane inaczej ni\u017c ma\u0142e, wi\u0119c wynik mo\u017ce by\u0107 nieintuicyjny.\n\n### Parametr `reverse`\n\nSortowanie malej\u0105ce:\n\n| Python |\n|---|\n| ```python\noceny = &#91;3, 5, 2, 4]\n\nprint(sorted(oceny, reverse=True))<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">|<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Wynik<\/th><\/tr><\/thead><tbody><tr><td><code>[5, 4, 3, 2]<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"parametr-key\">Parametr <code>key<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To najwa\u017cniejsza cz\u0119\u015b\u0107 praktycznego u\u017cycia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>key<\/code> nie zmienia danych &#8211; wskazuje tylko, wed\u0142ug czego maj\u0105 by\u0107 por\u00f3wnywane.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad: sortowanie napis\u00f3w wed\u0142ug d\u0142ugo\u015bci.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">| Python |<br>|&#8212;|<br>| &#8222;`python<br>slowa = [&#8222;informatyka&#8221;, &#8222;kod&#8221;, &#8222;algorytm&#8221;, &#8222;CPU&#8221;]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">print(sorted(slowa, key=len))<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Tutaj por\u00f3wnywana jest d\u0142ugo\u015b\u0107, nie tre\u015b\u0107.\n\n### Sortowanie s\u0142ownik\u00f3w i rekord\u00f3w\n\nTo bardzo cz\u0119sty przypadek w pracy z danymi.\n\n| Python |\n|---|\n| ```python\nstudenci = &#91;\n    {\"imie\": \"Anna\", \"punkty\": 82},\n    {\"imie\": \"Jan\", \"punkty\": 91},\n    {\"imie\": \"Ola\", \"punkty\": 75}\n]\n\nwynik = sorted(studenci, key=lambda x: x&#91;\"punkty\"], reverse=True)\n\nprint(wynik)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">|<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sortowanie po konkretnym polu jest standardem w raportach, API i przetwarzaniu danych biznesowych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"stabilnosc-sortowania\">Stabilno\u015b\u0107 sortowania<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Python u\u017cywa algorytmu Timsort. Jest stabilny, czyli elementy o tym samym kluczu zachowuj\u0105 wcze\u015bniejsz\u0105 kolejno\u015b\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To wa\u017cne przy sortowaniu wieloetapowym, np. najpierw po nazwisku, potem po wieku.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bez stabilno\u015bci wynik m\u00f3g\u0142by by\u0107 nieprzewidywalny.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"wydajnosc-zlozonosc-obliczeniowa-i-przypadki-uzycia-sorted-zwraca-nowa-posortowana-liste-z-iterowalnego-obiektu-przy-wiekszych-zbiorach-danych\">Wydajno\u015b\u0107, z\u0142o\u017cono\u015b\u0107 obliczeniowa i przypadki u\u017cycia Sorted \u2013 zwraca now\u0105 posortowan\u0105 list\u0119 z iterowalnego obiektu przy wi\u0119kszych zbiorach danych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dla wi\u0119kszo\u015bci przypadk\u00f3w z\u0142o\u017cono\u015b\u0107 czasowa wynosi:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Wz\u00f3r<\/th><\/tr><\/thead><tbody><tr><td><code>O(n log n)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">gdzie:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Symbol<\/th><th>Znaczenie<\/th><\/tr><\/thead><tbody><tr><td><code>n<\/code><\/td><td>liczba element\u00f3w<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Przy 10 elementach r\u00f3\u017cnica jest niezauwa\u017calna. Przy 1 000 000 rekord\u00f3w ju\u017c nie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Python stosuje Timsort &#8211; hybryd\u0119 merge sort i insertion sort. Algorytm zosta\u0142 zaprojektowany specjalnie do danych rzeczywistych, kt\u00f3re cz\u0119sto s\u0105 cz\u0119\u015bciowo uporz\u0105dkowane.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dlatego w praktyce dzia\u0142a szybciej ni\u017c \u201eczyste\u201d algorytmy teoretyczne.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"porownanie-z-c-i-c\">Por\u00f3wnanie z C i C++<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Python ukrywa szczeg\u00f3\u0142y implementacyjne, ale warto zna\u0107 odpowiedniki.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"c-qsort\">C &#8211; <code>qsort<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">| C |<br>|&#8212;|<br>| &#8222;`c<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">include<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">include<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">int porownaj(const void *a, const void *b)<br>{<br>return (<em>(int<\/em>)a &#8211; <em>(int<\/em>)b);<br>}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">int main()<br>{<br>int liczby[] = {5, 2, 9, 1};<br>int n = 4;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>qsort(liczby, n, sizeof(int), porownaj);\n\nfor(int i = 0; i &lt; n; i++)\n    printf(\"%d \", liczby&#91;i]);\n\nreturn 0;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Tutaj trzeba samodzielnie napisa\u0107 funkcj\u0119 por\u00f3wnuj\u0105c\u0105.\n\n### C++ \u2014 `sort`\n\n| C++ |\n|---|\n| ```cpp\n#include &lt;iostream&gt;\n#include &lt;algorithm&gt;\n\nusing namespace std;\n\nint main()\n{\n    int liczby&#91;] = {5, 2, 9, 1};\n\n    sort(liczby, liczby + 4);\n\n    for(int i = 0; i &lt; 4; i++)\n        cout &lt;&lt; liczby&#91;i] &lt;&lt; \" \";\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">|<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C++ daje wi\u0119ksz\u0105 kontrol\u0119 i zwykle wy\u017csz\u0105 wydajno\u015b\u0107, ale Python wygrywa prostot\u0105 oraz czytelno\u015bci\u0105.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"zuzycie-pamieci\">Zu\u017cycie pami\u0119ci<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Poniewa\u017c funkcja tworzy now\u0105 list\u0119, potrzebna jest dodatkowa pami\u0119\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dla bardzo du\u017cych zbior\u00f3w danych mo\u017ce to by\u0107 problem. Je\u015bli lista ma kilka milion\u00f3w rekord\u00f3w, kopia mo\u017ce oznacza\u0107 setki megabajt\u00f3w wi\u0119cej.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wtedy czasem lepiej u\u017cy\u0107 <code>.sort()<\/code> i \u015bwiadomie zaakceptowa\u0107 modyfikacj\u0119 orygina\u0142u.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"typowe-bledy-nieoczywiste-zachowania-i-rzeczy-na-ktore-naprawde-warto-uwazac-podczas-sortowania-danych\">Typowe b\u0142\u0119dy, nieoczywiste zachowania i rzeczy, na kt\u00f3re naprawd\u0119 warto uwa\u017ca\u0107 podczas sortowania danych<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"blad-z-none\">B\u0142\u0105d z <code>None<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119stszy przypadek:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">| Python |<br>|&#8212;|<br>| &#8222;`python<br>liczby = [3, 1, 2]<br>wynik = liczby.sort()<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">print(wynik)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Wynik:\n\n| Rezultat |\n|---|\n| `None` |\n\nTo nie jest awaria \u2014 tak dzia\u0142a metoda.\n\n### Mieszanie niepor\u00f3wnywalnych typ\u00f3w\n\n| Python |\n|---|\n| ```python\nprint(sorted(&#91;1, \"abc\", 3]))<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">|<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W nowoczesnym Pythonie zako\u0144czy si\u0119 to b\u0142\u0119dem <code>TypeError<\/code>, poniewa\u017c liczby i napisy nie maj\u0105 naturalnego porz\u0105dku por\u00f3wnania.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sortowanie-zbiorow\">Sortowanie zbior\u00f3w<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Zbi\u00f3r (<code>set<\/code>) nie zachowuje kolejno\u015bci. Po sortowaniu zawsze otrzymujemy list\u0119.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">| Python |<br>|&#8212;|<br>| &#8222;`python<br>dane = {4, 1, 7, 2}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">print(sorted(dane))<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>### `key=str.lower` dla tekstu\n\nJe\u015bli sortujemy napisy niezale\u017cnie od wielko\u015bci liter:\n\n| Python |\n|---|\n| ```python\nnazwy = &#91;\"Zenon\", \"adam\", \"Beata\"]\n\nprint(sorted(nazwy, key=str.lower))<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">|<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To daje wynik bardziej naturalny dla u\u017cytkownika.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"lambda-kontra-funkcje-nazwane\">Lambda kontra funkcje nazwane<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dla prostych przypadk\u00f3w <code>lambda<\/code> jest wygodna, ale przy bardziej z\u0142o\u017conej logice lepiej u\u017cy\u0107 zwyk\u0142ej funkcji. Kod staje si\u0119 czytelniejszy i \u0142atwiejszy do testowania.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zbyt rozbudowane <code>lambda<\/code> s\u0105 cz\u0119stym \u017ar\u00f3d\u0142em chaosu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-funkcja-dziala-tylko-na-listach\">Czy funkcja dzia\u0142a tylko na listach?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Mo\u017cna przekaza\u0107 ka\u017cdy obiekt iterowalny: list\u0119, krotk\u0119, zbi\u00f3r, napis, generator, wynik <code>range()<\/code> i wiele innych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-wynik-zawsze-jest-lista\">Dlaczego wynik zawsze jest list\u0105?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Taka jest definicja funkcji. Nawet je\u015bli wej\u015bciem jest krotka lub zbi\u00f3r, wynik zostaje zwr\u00f3cony jako lista.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kiedy-lepiej-uzyc-sort-zamiast-sorted\">Kiedy lepiej u\u017cy\u0107 <code>.sort()<\/code> zamiast <code>sorted()<\/code>?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Gdy pracujemy na du\u017cej li\u015bcie i nie potrzebujemy zachowa\u0107 oryginalnej kolejno\u015bci, a dodatkowe zu\u017cycie pami\u0119ci by\u0142oby problemem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-mozna-sortowac-po-kilku-kryteriach-jednoczesnie\">Czy mo\u017cna sortowa\u0107 po kilku kryteriach jednocze\u015bnie?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak. Najcz\u0119\u015bciej u\u017cywa si\u0119 krotki jako klucza.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">| Python |<br>|&#8212;|<br>| <code>python wynik = sorted(dane, key=lambda x: (x[\"nazwisko\"], x[\"wiek\"]))<\/code> |<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najpierw por\u00f3wnywane jest nazwisko, potem wiek.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-sortowanie-w-pythonie-jest-stabilne\">Czy sortowanie w Pythonie jest stabilne?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak. Python u\u017cywa stabilnego algorytmu Timsort, wi\u0119c elementy o tym samym kluczu zachowuj\u0105 poprzedni\u0105 kolejno\u015b\u0107.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-reverse-true-jest-tym-samym-co-odwrocenie-listy-po-sortowaniu\">Czy <code>reverse=True<\/code> jest tym samym co odwr\u00f3cenie listy po sortowaniu?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ko\u0144cowy efekt cz\u0119sto wygl\u0105da podobnie, ale semantycznie to nadal sortowanie malej\u0105ce, a nie zwyk\u0142e odwr\u00f3cenie aktualnej kolejno\u015bci.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"krotkie-zamkniecie-tematu-z-perspektywy-codziennej-pracy-programisty\">Kr\u00f3tkie zamkni\u0119cie tematu z perspektywy codziennej pracy programisty<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dobrze wykonane sortowanie nie jest detalem kosmetycznym. Od niego zale\u017cy poprawno\u015b\u0107 raport\u00f3w, kolejno\u015b\u0107 przetwarzania danych i cz\u0119sto zwyk\u0142a czytelno\u015b\u0107 wynik\u00f3w dla cz\u0142owieka. W praktyce najbezpieczniejsze jest u\u017cywanie funkcji, kt\u00f3ra nie niszczy danych wej\u015bciowych i pozwala jasno okre\u015bli\u0107 kryterium por\u00f3wnania. Im wcze\u015bniej ten nawyk si\u0119 pojawi, tym mniej czasu p\u00f3\u017aniej traci si\u0119 na szukanie b\u0142\u0119d\u00f3w, kt\u00f3re \u201eprzecie\u017c nie powinny si\u0119 wydarzy\u0107\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Porz\u0105dkowanie danych to jedna z tych czynno\u015bci, kt\u00f3re wydaj\u0105 si\u0119 banalne dop\u00f3ki nie trzeba zrobi\u0107 tego dobrze, szybko i bez utraty informacji. Sortowanie pojawia si\u0119 przy analizie log\u00f3w, wynik\u00f3w pomiar\u00f3w, list u\u017cytkownik\u00f3w, raport\u00f3w finansowych i zwyk\u0142ych danych wej\u015bciowych w programie. W Pythonie najwygodniejszym narz\u0119dziem do tego celu jest funkcja wbudowana, kt\u00f3ra nie modyfikuje \u017ar\u00f3d\u0142a danych i daje przewidywalny wynik: Sorted. Sorted \u2013 zwraca now\u0105 posortowan\u0105 list\u0119 z iterowalnego obiektu i dlaczego r\u00f3\u017cni si\u0119 od metody sort stosowanej na listach W Pythonie istniej\u0105 dwa podstawowe sposoby sortowania: funkcja sorted() oraz metoda .sort() dost\u0119pna dla list. R\u00f3\u017cnica nie jest kosmetyczna &#8211; wp\u0142ywa na bezpiecze\u0144stwo danych, czytelno\u015b\u0107 kodu i p\u00f3\u017aniejsze b\u0142\u0119dy logiczne. sorted() dzia\u0142a na dowolnym obiekcie iterowalnym. Oznacza to, \u017ce mo\u017cna przekaza\u0107 nie tylko list\u0119, ale te\u017c krotk\u0119, zbi\u00f3r, napis, generator czy wynik funkcji range(). Najwa\u017cniejsza cecha: funkcja zwraca now\u0105 list\u0119. Oryginalne dane pozostaj\u0105 bez zmian. To ma praktyczne znaczenie. Je\u015bli sortujemy dane wej\u015bciowe u\u017cywane p\u00f3\u017aniej w innej cz\u0119\u015bci programu, nadpisanie ich mo\u017ce prowadzi\u0107 do trudnych do wykrycia b\u0142\u0119d\u00f3w. W systemach raportowych albo przy analizie danych takie pomy\u0142ki kosztuj\u0105 czas, a czasem tak\u017ce pieni\u0105dze. Metoda .sort() dzia\u0142a tylko na li\u015bcie i modyfikuje j\u0105 \u201ew miejscu\u201d, czyli bez tworzenia nowego obiektu. Tabela por\u00f3wnawcza: Cecha sorted() .sort() Typ dzia\u0142ania funkcja wbudowana metoda listy Obs\u0142ugiwane typy ka\u017cdy obiekt iterowalny tylko lista Zwracana warto\u015b\u0107 nowa lista None Modyfikacja orygina\u0142u nie tak Bezpiecze\u0144stwo danych wej\u015bciowych wy\u017csze ni\u017csze Przyk\u0142ad r\u00f3\u017cnicy: Python &#8222;`python liczby = [5, 2, 9, 1] wynik = sorted(liczby) print(liczby)print(wynik) Wynik: Orygina\u0142 Wynik sortowania [5, 2, 9, 1] [1, 2, 5, 9] Dla por\u00f3wnania: | Python ||&#8212;|| &#8222;`pythonliczby = [5, 2, 9, 1] liczby.sort() print(liczby) | Wynik: Liczby Napisy [1, 3, 7, 8] [&#8217;ala&#8217;, 'kot&#8217;, 'pies&#8217;] W przypadku napis\u00f3w wielko\u015b\u0107 liter ma znaczenie: | Python ||&#8212;|| &#8222;`pythonprint(sorted([&#8222;Zenon&#8221;, &#8222;adam&#8221;, &#8222;Beata&#8221;])) | Wynik: Wynik [5, 4, 3, 2] Parametr key To najwa\u017cniejsza cz\u0119\u015b\u0107 praktycznego u\u017cycia. key nie zmienia danych &#8211; wskazuje tylko, wed\u0142ug czego maj\u0105 by\u0107 por\u00f3wnywane. Przyk\u0142ad: sortowanie napis\u00f3w wed\u0142ug d\u0142ugo\u015bci. | Python ||&#8212;|| &#8222;`pythonslowa = [&#8222;informatyka&#8221;, &#8222;kod&#8221;, &#8222;algorytm&#8221;, &#8222;CPU&#8221;] print(sorted(slowa, key=len)) | Sortowanie po konkretnym polu jest standardem w raportach, API i przetwarzaniu danych biznesowych. Stabilno\u015b\u0107 sortowania Python u\u017cywa algorytmu Timsort. Jest stabilny, czyli elementy o tym samym kluczu zachowuj\u0105 wcze\u015bniejsz\u0105 kolejno\u015b\u0107. To wa\u017cne przy sortowaniu wieloetapowym, np. najpierw po nazwisku, potem po wieku. Bez stabilno\u015bci wynik m\u00f3g\u0142by by\u0107 nieprzewidywalny. Wydajno\u015b\u0107, z\u0142o\u017cono\u015b\u0107 obliczeniowa i przypadki u\u017cycia Sorted \u2013 zwraca now\u0105 posortowan\u0105 list\u0119 z iterowalnego obiektu przy wi\u0119kszych zbiorach danych Dla wi\u0119kszo\u015bci przypadk\u00f3w z\u0142o\u017cono\u015b\u0107 czasowa wynosi: Wz\u00f3r O(n log n) gdzie: Symbol Znaczenie n liczba element\u00f3w Przy 10 elementach r\u00f3\u017cnica jest niezauwa\u017calna. Przy 1 000 000 rekord\u00f3w ju\u017c nie. Python stosuje Timsort &#8211; hybryd\u0119 merge sort i insertion sort. Algorytm zosta\u0142 zaprojektowany specjalnie do danych rzeczywistych, kt\u00f3re cz\u0119sto s\u0105 cz\u0119\u015bciowo uporz\u0105dkowane. Dlatego w praktyce dzia\u0142a szybciej ni\u017c \u201eczyste\u201d algorytmy teoretyczne. Por\u00f3wnanie z C i C++ Python ukrywa szczeg\u00f3\u0142y implementacyjne, ale warto zna\u0107 odpowiedniki. C &#8211; qsort | C ||&#8212;|| &#8222;`c include include int porownaj(const void *a, const void *b){return ((int)a &#8211; (int)b);} int main(){int liczby[] = {5, 2, 9, 1};int n = 4; } | C++ daje wi\u0119ksz\u0105 kontrol\u0119 i zwykle wy\u017csz\u0105 wydajno\u015b\u0107, ale Python wygrywa prostot\u0105 oraz czytelno\u015bci\u0105. Zu\u017cycie pami\u0119ci Poniewa\u017c funkcja tworzy now\u0105 list\u0119, potrzebna jest dodatkowa pami\u0119\u0107. Dla bardzo du\u017cych zbior\u00f3w danych mo\u017ce to by\u0107 problem. Je\u015bli lista ma kilka milion\u00f3w rekord\u00f3w, kopia mo\u017ce oznacza\u0107 setki megabajt\u00f3w wi\u0119cej. Wtedy czasem lepiej u\u017cy\u0107 .sort() i \u015bwiadomie zaakceptowa\u0107 modyfikacj\u0119 orygina\u0142u. Typowe b\u0142\u0119dy, nieoczywiste zachowania i rzeczy, na kt\u00f3re naprawd\u0119 warto uwa\u017ca\u0107 podczas sortowania danych B\u0142\u0105d z None Najcz\u0119stszy przypadek: | Python ||&#8212;|| &#8222;`pythonliczby = [3, 1, 2]wynik = liczby.sort() print(wynik) | W nowoczesnym Pythonie zako\u0144czy si\u0119 to b\u0142\u0119dem TypeError, poniewa\u017c liczby i napisy nie maj\u0105 naturalnego porz\u0105dku por\u00f3wnania. Sortowanie zbior\u00f3w Zbi\u00f3r (set) nie zachowuje kolejno\u015bci. Po sortowaniu zawsze otrzymujemy list\u0119. | Python ||&#8212;|| &#8222;`pythondane = {4, 1, 7, 2} print(sorted(dane)) | To daje wynik bardziej naturalny dla u\u017cytkownika. Lambda kontra funkcje nazwane Dla prostych przypadk\u00f3w lambda jest wygodna, ale przy bardziej z\u0142o\u017conej logice lepiej u\u017cy\u0107 zwyk\u0142ej funkcji. Kod staje si\u0119 czytelniejszy i \u0142atwiejszy do testowania. Zbyt rozbudowane lambda s\u0105 cz\u0119stym \u017ar\u00f3d\u0142em chaosu. FAQ Czy funkcja dzia\u0142a tylko na listach? Nie. Mo\u017cna przekaza\u0107 ka\u017cdy obiekt iterowalny: list\u0119, krotk\u0119, zbi\u00f3r, napis, generator, wynik range() i wiele innych. Dlaczego wynik zawsze jest list\u0105? Taka jest definicja funkcji. Nawet je\u015bli wej\u015bciem jest krotka lub zbi\u00f3r, wynik zostaje zwr\u00f3cony jako lista. Kiedy lepiej u\u017cy\u0107 .sort() zamiast sorted()? Gdy pracujemy na du\u017cej li\u015bcie i nie potrzebujemy zachowa\u0107 oryginalnej kolejno\u015bci, a dodatkowe zu\u017cycie pami\u0119ci by\u0142oby problemem. Czy mo\u017cna sortowa\u0107 po kilku kryteriach jednocze\u015bnie? Tak. Najcz\u0119\u015bciej u\u017cywa si\u0119 krotki jako klucza. | Python ||&#8212;|| python wynik = sorted(dane, key=lambda x: (x[&#8222;nazwisko&#8221;], x[&#8222;wiek&#8221;])) | Najpierw por\u00f3wnywane jest nazwisko, potem wiek. Czy sortowanie w Pythonie jest stabilne? Tak. Python u\u017cywa stabilnego algorytmu Timsort, wi\u0119c elementy o tym samym kluczu zachowuj\u0105 poprzedni\u0105 kolejno\u015b\u0107. Czy reverse=True jest tym samym co odwr\u00f3cenie listy po sortowaniu? Ko\u0144cowy efekt cz\u0119sto wygl\u0105da podobnie, ale semantycznie to nadal sortowanie malej\u0105ce, a nie zwyk\u0142e odwr\u00f3cenie aktualnej kolejno\u015bci. Kr\u00f3tkie zamkni\u0119cie tematu z perspektywy codziennej pracy programisty Dobrze wykonane sortowanie nie jest detalem kosmetycznym. Od niego zale\u017cy poprawno\u015b\u0107 raport\u00f3w, kolejno\u015b\u0107 przetwarzania danych i cz\u0119sto zwyk\u0142a czytelno\u015b\u0107 wynik\u00f3w dla cz\u0142owieka. W praktyce najbezpieczniejsze jest u\u017cywanie funkcji, kt\u00f3ra nie niszczy danych wej\u015bciowych i pozwala jasno okre\u015bli\u0107 kryterium por\u00f3wnania. Im wcze\u015bniej ten nawyk si\u0119 pojawi, tym mniej czasu p\u00f3\u017aniej traci si\u0119 na szukanie b\u0142\u0119d\u00f3w, kt\u00f3re \u201eprzecie\u017c nie powinny si\u0119 wydarzy\u0107\u201d. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1542,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[],"class_list":["post-1541","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jezyk-programowania"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1541","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1541"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1541\/revisions"}],"predecessor-version":[{"id":1543,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1541\/revisions\/1543"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1542"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}