Jak třídit seznamy v Pythonu

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.