Tento článek vám poskytne návod, jakým způsobem lze seřadit seznamy v Pythonu.
V Pythonu je možné použít metodu `sort()` pro seřazení seznamu přímo na místě. Alternativně, vestavěná funkce `sorted()` umožňuje získat setříděnou kopii seznamu bez ovlivnění originálu.
V tomto tutoriálu se dozvíte:
- O syntaxi metody `sort()` a funkce `sorted()`.
- Ukázky kódu pro řazení seznamů vzestupně i sestupně.
- Jak přizpůsobit řazení pomocí parametru `key`.
- Jaký je rozdíl mezi metodou `sort()` a funkcí `sorted()`.
Začněme! 👩🏽💻
Syntaxe metody `sort()` v Pythonu
Metoda `sort()` je aplikovatelná na seznamy v Pythonu. Seřadí prvky seznamu přímo v daném seznamu, což znamená, že původní seznam je modifikován.
Zde je syntaxe metody `sort()` v Pythonu:
<seznam>.sort(reverse = True | False, key = <funkce>)
Nyní si tuto syntaxi rozeberme:
- `<seznam>` je libovolný platný seznam v Pythonu.
- `reverse` je volitelný parametr, který může mít hodnotu `True` nebo `False`.
- Výchozí hodnota `reverse` je `False`, což znamená řazení vzestupně. Pro seřazení seznamu sestupně, nastavte tento parametr na `True`.
- `key` je rovněž volitelný parametr, který je nastaven na `<funkce>`.
- `<funkce>` může být jak vestavěná funkce, tak i funkce definovaná uživatelem.
V následující sekci začneme s jednoduchými příklady.
Jak seřadit seznam v Pythonu vzestupně
Představme si seznam čísel. Pro seřazení seznamu vzestupně stačí použít metodu `sort()` na tomto seznamu.
▶ Spusťte následující kód:
cisla = [25, 13, 6, 17, 9] cisla.sort() print(cisla) # Výstup: [6, 9, 13, 17, 25]
Čísla v seznamu byla seřazena vzestupně a původní seznam byl změněn. Tento způsob se nazývá třídění na místě.
Jak seřadit seznam v Pythonu sestupně
Pro seřazení seznamu sestupně je třeba nastavit parametr `reverse` na `True`, jak je ukázáno níže:
cisla = [25, 13, 6, 17, 9] cisla.sort(reverse = True) print(cisla) # Výstup: [25, 17, 13, 9, 6]
Jak je vidět, seznam je nyní seřazen v sestupném pořadí.
Jak používat parametr `key` s metodou `sort()`
V této sekci využijeme parametr `key` pro přizpůsobení řazení.
Následuje funkce `mod5()`, která přijímá číslo `x` a vrací zbytek po dělení čísla `x` pěti.
def mod5(x): return x % 5
Tuto funkci bychom rádi použili jako klíč.
Nyní spusťte následující kód:
cisla = [25, 13, 6, 17, 9] cisla.sort(key = mod5) print(cisla) # Výstup: [25, 6, 17, 13, 9]
Podívejme se na výstup.
Vidíme, že místo běžného řazení se nyní řazení řídí zbytkem po dělení 5, který je určen funkcí `mod5`.
- Číslo, které po dělení 5 dává nejmenší zbytek, je na začátku seznamu.
- Číslo s největším zbytkem po dělení 5 se nachází na konci seřazeného seznamu.
Pro ověření, že tomu tak skutečně je, spusťte následující kód:
cisla = [25, 13, 6, 17, 9] for num in cisla: print(f"{num} má zbytek {num%5} po dělení 5") # Výstup 25 má zbytek 0 po dělení 5 13 má zbytek 3 po dělení 5 6 má zbytek 1 po dělení 5 17 má zbytek 2 po dělení 5 9 má zbytek 4 po dělení 5
Číslo 25 je dělitelné 5 beze zbytku, zbytek je tedy 0, proto je na první pozici. Číslo 6 dává zbytek 1, takže je druhé v pořadí, a tak dále. Číslo 9 má po dělení 5 zbytek 4, proto je poslední.
Místo definování samostatné funkce můžete použít i lambda funkce. Lambda funkce jsou anonymní funkce s jedním výrazem. Syntax `lambda args : výraz` vrací výsledek vyhodnocení daného výrazu s argumenty.
Přepišme výše uvedené řazení pomocí lambda výrazu:
cisla = [25, 13, 6, 17, 9] cisla.sort(key = lambda x:x%5) print(cisla) # Výstup: [25, 6, 17, 13, 9]
Zatím jsme se zabývali řazením seznamů čísel. Dále se podíváme, jak řadit seznamy řetězců.
Jak seřadit seznam v Pythonu abecedně
V této části se naučíme, jak seřadit seznam řetězců – s příklady inspirovanými Harry Potterem. ✨
V našem příkladu seznam studentů reprezentuje studenty v Bradavicích. Chtěli bychom je seřadit abecedně podle jmen.
Při řazení seznamu řetězců se ve výchozím nastavení použije abecední řazení.
studenti = ["Harry", "Ron", "Hermiona", "Draco", "Cedric"]
Vytiskneme si seřazený seznam, abychom zkontrolovali výsledek.
studenti.sort() print(studenti) # Výstup ['Cedric', 'Draco', 'Harry', 'Hermiona', 'Ron']
Jak seřadit seznam v Pythonu v obráceném abecedním pořadí
Pro seřazení seznamu v obráceném abecedním pořadí, nastavte `reverse = True`, jak ukazuje následující kód:
studenti.sort(reverse = True) print(studenti) # Výstup ['Ron', 'Hermiona', 'Harry', 'Draco', 'Cedric']
Z výstupu je vidět, že seznam byl seřazen v obráceném pořadí.
Jak přizpůsobit řazení pomocí parametru `key`
V této sekci upravíme řazení pomocí volitelného parametru `key`.
Uvažujme následující seznam, `domy`:
domy = [ {1:"Draco", "house":"Zmijozel"}, {2:"Harry", "house":"Nebelvír"}, {3:"Cedric", "house":"Mrzimor"} ]
Zde `domy` představují seznam slovníků. Každý slovník obsahuje dva páry klíč-hodnota, jeden určuje jméno studenta a druhý kolej, do které patří.
Nyní bychom rádi seřadili seznam domů abecedně podle názvu koleje, do které patří.
Jak už tušíte, měli bychom nastavit parametr `key` na kolej daného studenta.
Pro získání názvu koleje každého studenta můžeme definovat funkci `returnHouse()`, jak je uvedeno níže:
def returnHouse(student): return student['house']
Tato funkce vrací název koleje, do které daný student patří.
Nyní můžeme použít metodu `sort()` na seznamu domů, jak je ukázáno:
domy.sort(key=returnHouse)
Ve výstupu níže si všimněte, že seznam je seřazen podle názvu koleje, a nikoli podle jmen studentů. Proto máme Nebelvír, Mrzimor a Zmijozel – v abecedním pořadí.
print(domy) # Výstup [{2: 'Harry', 'house': 'Nebelvír'}, {3: 'Cedric', 'house': 'Mrzimor'}, {1: 'Draco', 'house': 'Zmijozel'}]
Parametr `key` můžeme definovat také pomocí lambda funkce. Pro každou položku seznamu tato funkce vrátí kolej pro danou položku.
▶ Ověřte to spuštěním následujícího kódu:
domy.sort(key=lambda student:student["house"]) print(domy) # Výstup [{2: 'Harry', 'house': 'Nebelvír'}, {3: 'Cedric', 'house': 'Mrzimor'}, {1: 'Draco', 'house': 'Zmijozel'}]
Ve všech dosavadních příkladech jsme používali metodu `sort()` na seznamu. Víme tedy, že metoda modifikuje původní seznam.
Co když chceme zachovat původní seznam nezměněný a získat pouze jeho seřazenou kopii?
V Pythonu k tomuto účelu slouží funkce `sorted()`.
Syntaxe funkce `sorted()` v Pythonu
Funkce `sorted()` přijímá jako argument seznam nebo jakoukoli kolekci. A vrací seřazenou kopii seznamu – původní seznam se nezmění.
Syntaxe funkce `sorted()` v Pythonu je:
<seřazená_kopie> = sorted(<seznam>, reverse = True | False, key = <funkce>)
Všimněte si, že syntaxe je velmi podobná metodě `sort()`, kterou jsme probírali dříve.
- `<seznam>` je jakýkoli platný seznam v Pythonu a je povinným argumentem.
- `reverse` a `key` jsou volitelné parametry.
Poznámka: Na rozdíl od metody `sort()`, která funguje pouze na seznamech, funkce `sorted()` může být použita pro řazení libovolných iterovatelných objektů, jako jsou seznamy, řetězce a slovníky.
Jak seřadit seznam v Pythonu pomocí funkce `sorted()`
1. V tomto příkladu je `cisla` seznam čísel.
Můžeme zavolat funkci `sorted()` s argumentem `cisla`. A přiřadit výsledek do nového seznamu `serazena_cisla1`.
cisla = [25, 13, 6, 17, 9] serazena_cisla1 = sorted(cisla) print(serazena_cisla1) # Výstup: [6, 9, 13, 17, 25]
Ve výše uvedeném výstupu vidíme, že hodnoty v seznamu `cisla` byly seřazeny vzestupně.
Také si všimněte, že původní seznam `cisla` nebyl změněn – protože `sorted()` vrací nový seznam. To je ověřeno níže:
print(cisla) # Výstup: [25, 13, 6, 17, 9]
2. Nyní nastavme volitelný parametr `reverse` na `True` a získejme `serazena_cisla2`.
Jak je uvedeno v následujícím kódu, `serazena_cisla2` je nový seznam s prvky seřazenými sestupně.
serazena_cisla2 = sorted(cisla, reverse = True) print(serazena_cisla2) # Výstup: [25, 17, 13, 9, 6]
3. V tomto příkladu budeme pracovat se seznamem řetězců.
Stejně jako v předchozích příkladech, volání funkce `sorted()` vrátí nový seznam. A prvky jsou seřazeny abecedně.
ovoce = ['hrušky', 'jahody', 'jablka', 'ananas', 'borůvky'] serazene_ovoce1 = sorted(ovoce) print(serazene_ovoce1) # Výstup: ['ananas', 'borůvky', 'hrušky', 'jablka', 'jahody']
4. Nyní přizpůsobíme řazení pomocí volitelného parametru `key`. Nastavíme `key` na `len`. Tím se seznam seřadí podle délky jednotlivých řetězců.
Poznámka: V Pythonu vestavěná funkce `len()` přijímá jakýkoli iterovatelný objekt, jako jsou seznamy, řetězce, n-tice a tak dále. A vrací délku objektu.
Řetězec s nejkratší délkou se v seřazeném seznamu objeví jako první a nejdelší řetězec se objeví na konci seznamu.
ovoce = ['hruška', 'jahody', 'jablko', 'ananas', 'borůvky'] serazene_ovoce2 = sorted(ovoce, key=len) print(serazene_ovoce2) # Výstup: ['hruška', 'jablko', 'ananas', 'borůvky', 'jahody']
Ve výše uvedeném výstupu je nejkratší řetězec `hruška` a nejdelší řetězec je `jahody`.
Metoda `sort()` vs. funkce `sorted()` v Pythonu
Dosud jsme se naučili, jak používat metodu `sort()` a také funkci `sorted()`. V této části si shrneme rozdíly mezi těmito dvěma metodami.
Metoda `seznam.sort()` v Pythonu | Funkce `sorted()` v Pythonu |
Seřadí seznam na místě – upravuje původní seznam. | Vrací nový seřazený seznam. |
Funguje pouze se seznamy v Pythonu. | Funguje s jakýmikoli iterovatelnými objekty v Pythonu, jako jsou seznamy, řetězce a další kolekce. |
Nemá návratovou hodnotu (vrací `None`). | Vrací seřazenou kopii iterovatelného objektu. |
Shrnutí 👩🏫
Doufám, že vám byl tento tutoriál o seznamech v Pythonu užitečný.
Rychle si zopakujme, co jsme probrali:
- Pro seřazení seznamu přímo na místě použijte `seznam.sort(reverse = True | False, key = <funkce>)` s volitelnými parametry `reverse` a `key`.
- Pro získání seřazené kopie seznamu použijte `sorted(seznam, reverse = True | False, key = <funkce>)`.
Nyní, když umíte seřadit seznamy v Pythonu, přečtěte si o list comprehensions. Také se můžete naučit, jak pracovat se soubory, nebo se soubory JSON v Pythonu.
Příklady uvedené výše si můžete vyzkoušet v online Python kompilátoru na etechblog.cz.