2023-07-07 11:39 Doba čtení: 11 min

Porozumění tříděné funkci v Pythonu: Jednoduchý průvodce

Jednou z hlavních předností jazyka Python je jeho uživatelská přívětivost. Práce s ním je jednoduchá, protože jeho standardní knihovna nabízí bohaté množství užitečných nástrojů. Mezi tyto nástroje se řadí i funkce pro řazení.

Tato funkce umožňuje uspořádat prvky v iterovatelných objektech podle stanoveného kritéria. Bez této funkce by bylo nutné psát vlastní kód pro implementaci třídicích algoritmů, jako je Bubble Sort nebo Insertion Sort, což může být náročné. Python však nabízí efektivnější řešení, které si v tomto článku podrobně probereme.

Seznámení s funkcí sorted()

Funkce `sorted()` slouží k seřazení prvků v iterovatelných objektech v Pythonu. Iterovatelným objektem rozumíme jakoukoliv strukturu, kterou lze procházet pomocí smyčky. Mezi příklady iterovatelných objektů patří řetězce, seznamy, n-tice (tuples) a množiny. Tyto objekty bývají často neuspořádané a funkce `sorted()` zajistí jejich seřazení do požadovaného pořadí. Seřazování dat je užitečné z několika důvodů:

  • Efektivnější vyhledávání: Seřazené hodnoty umožňují rychlejší a účinnější vyhledávání pomocí algoritmů, jako je binární vyhledávání. Nicméně, binární vyhledávání vyžaduje, aby data byla nejprve seřazena.
  • Prezentace dat: Uživatelé často potřebují zobrazit data seřazená, například od nejnižší ceny nebo od nejnovějšího příspěvku. To vyžaduje implementaci mechanismu pro seřazení seznamu hodnot.
  • Statistická analýza: Seřazení dat usnadňuje provádění statistické analýzy, například hledání nejčastější hodnoty v souboru. Seřazená data jsou pro tyto účely mnohem přehlednější.

Průvodce použitím funkce sorted()

Jak již bylo zmíněno, funkce `sorted()` je univerzální a pracuje s libovolnými iterovatelnými objekty. Důležité je, že výstupem této funkce je vždy nový seznam, který je seřazen. Tedy, ačkoliv vstup může být jakýkoliv iterovatelný objekt, výstupem je vždy seznam.

Syntaxe funkce sorted()

Zápis funkce `sorted()` vypadá následovně:

sorted(iterable, key=None, reverse=False)

Jak je vidět, jediným povinným argumentem je `iterable`, tedy objekt, který chceme seřadit.

Argument `key` je volitelný. Umožňuje specifikovat funkci, která transformuje každý prvek v iterovatelném objektu na hodnotu, podle které se bude řadit. To je velmi užitečné například při řazení seznamu slovníků. Výchozí hodnota je `None`, tedy pokud není funkce klíče specifikována, žádná transformace se neprovádí.

Posledním argumentem je `reverse`. Při nastavení na `True` se prvky seřadí v opačném pořadí.

V následující části si na příkladech ukážeme, jak funkci `sorted()` používat.

Příklady použití funkce sorted()

Seznam čísel

Nejjednodušším příkladem je seřazení seznamu čísel. Podívejme se na tento ukázkový kód:

# Seznam neseřazených hodnot
numbers = [8, 4, 3, 9, 2, 0, 3]

# Seřazení čísel
sorted_numbers = sorted(numbers)

# Výpis seřazených hodnot
print(sorted_numbers)

Výstup tohoto kódu bude:

[0, 2, 3, 3, 4, 8, 9]

Jak je vidět, hodnoty byly seřazeny vzestupně. Pokud bychom chtěli hodnoty seřadit sestupně, stačí nastavit `reverse` na `True`. Řádek 4 předchozího příkladu by pak vypadal takto:

sorted_numbers = sorted(numbers, reverse=True)

Výstup upraveného programu by byl:

[9, 8, 4, 3, 3, 2, 0]

Seznam řetězců

Funkce `sorted()` nepracuje jen s čísly, umí řadit i řetězce. Řetězce v seznamu se porovnávají podle prvních znaků, na základě jejich ASCII hodnot. Například "ahoj" by bylo před "svět", protože ASCII hodnota "h" je 104, což je méně než ASCII hodnota "w", která je 119.

Pokud má více řetězců stejný první znak, porovnávají se jejich druhé, třetí a další znaky, dokud se neurčí jejich pořadí. Podívejme se na příklad řazení jmen:

# Vytvoření seznamu jmen
members_list = ['bob', 'dave', 'charlie', 'alice']

# Seřazení jmen
sorted_members_list = sorted(members_list)

# Výpis jmen
print(sorted_members_list)

Výstup tohoto kódu bude:

['alice', 'bob', 'charlie', 'dave']

Protože se používají ASCII hodnoty, pořadí řetězců závisí na tom, který znak se v tabulce ASCII nachází dříve. Například velká písmena budou před malými, protože v ASCII se velká písmena nacházejí dříve. Zde je kompletní tabulka ASCII pro vaši informaci:

Zdroj: commons.wikimedia.org

Další iterovatelné objekty - řetězce, n-tice a množiny

Jak již bylo zmíněno, funkce `sorted()` pracuje s různými iterovatelnými objekty. Stejná pravidla platí pro to, jak jsou hodnoty v těchto objektech seřazeny. Zde je příklad:

# Výpis seřazeného řetězce
print(sorted("dijkstra"))

# Výpis seřazené n-tice
print(sorted((3, 4, 2, 1, 5, 0)))

# Výpis seřazené množiny
print(sorted(set([4, 5, 5, 1, 3, 8, 9])))

Výstup z tohoto kódu bude:

['a', 'd', 'i', 'j', 'k', 'r', 's', 't']
[0, 1, 2, 3, 4, 5]
[1, 3, 4, 5, 8, 9]

Jak je vidět, výstupem je v každém případě seznam.

Seznam slovníků

Funkci `sorted()` můžete použít i pro řazení seznamu slovníků. Řazení slovníků je však o něco složitější, protože každý slovník má více vlastností, které by mohly být použity pro porovnání.

Pro seřazení seznamu slovníků je nutné specifikovat funkci, která transformuje celý slovník na jednu hodnotu, podle které se bude řadit. Tato funkce se předává funkci `sorted()` jako argument `key`. Zde je příklad:

people = [
        { 'name': 'Alice', 'age': 27 },
        { 'name': 'Bob', 'age':  23 },
        { 'name': 'Charlie', 'age': 25}
]

people_sorted_by_age = sorted(people, key=lambda person: person['age'])
print(people_sorted_by_age)

V tomto příkladu máme tři osoby reprezentované slovníky, každý s atributy `name` a `age`. Chceme osoby seřadit podle věku. Proto při volání funkce `sorted()` předáváme funkci jako argument `key`.

Tato funkce přebírá objekt slovníku osoby a vrací její věk. Návratová hodnota této funkce se použije pro porovnání. Celý slovník je tedy shrnut do jednoduchého celého čísla, které je možné porovnávat. Pro zjednodušení jsem pro definici argumentu `key` použil lambda funkci.

Spuštění kódu vytvoří následující výstup:

[{'name': 'Bob', 'age': 23}, {'name': 'Charlie', 'age': 25}, {'name': 'Alice', 'age': 27}]

Použití argumentu klíče

Argument `key` se nemusí používat pouze při řazení slovníků, je univerzálně využitelný pro všechny hodnoty. Slouží k tomu, aby poskytl klíč, podle kterého se budou hodnoty řadit. Zde je několik příkladů:

  • Řazení hodnot podle délky, kdy definujeme funkci klíče, která přebírá hodnotu a vrací její délku.
  • Řazení řetězců v seznamu bez ohledu na velikost písmen. K tomu lze všechny řetězce v seznamu převést na malá písmena. Dosáhneme toho definováním funkce klíče, která přebírá řetězec a vrací jeho verzi s malými písmeny.
  • Řazení hodnot podle složené hodnoty, která kombinuje hodnoty z více položek.

Časová složitost funkce sorted()

Funkce `sorted()` má časovou složitost O(n log n), kde n je počet prvků v iterovatelném objektu. Tato složitost vyplývá z faktu, že funkce využívá algoritmus Timsort, který je hybridním algoritmem založeným na Merge Sort a Insertion Sort.

Prostorová složitost funkce je O(n), kde n je opět počet prvků na vstupu. Je tomu tak proto, že se vytváří nový seznam.

Funkce sorted() vs. metoda sort()

Další možností pro řazení hodnot je metoda `sort()` seznamu. V této části si vysvětlíme klíčové rozdíly mezi funkcí `sorted()` a metodou `sort()`.

  • Metoda `sort()` modifikuje iterovatelný objekt přímo (in-place), zatímco funkce `sorted()` vytváří nový seřazený seznam a ten vrací.
  • Protože metoda `sort()` modifikuje seznam přímo, vyžaduje, aby vstupem byl seznam. Funkce `sorted()`, na druhou stranu, přijímá jakýkoliv iterovatelný objekt a vytvoří z něj nový seřazený seznam.

Závěrem

V tomto článku jsme probrali funkci `sorted()` - její účel, způsob použití a různé argumenty. Podívali jsme se na různé příklady použití, zmínili jsme její časovou složitost a porovnali ji s metodou `sort()`.

Pokud vás Python zajímá dále, možná by vás mohl zajímat i náš článek o funkci `sum()`.

Petra Kovářová
Autor
Czechia

Sleduje mobilní technologie, Android/iOS a praktické návody pro uživatele.

Předchozí článek
10 nejlepších bezpečnostních systémů NVR pro inteligentní dohled
Další článek
13 nejlepších chytrých ponožek Owlet a alternativ k použití jako chůvičky