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

Jednou z velkých výhod používání Pythonu je jeho jednoduchost. Je snadné s ním pracovat, protože jeho standardní knihovna má mnoho užitečných funkcí. Jednou z takových funkcí je funkce třídění.

Tato funkce se používá k řazení iterovatelných položek podle určitého pořadí. Bez takové funkce je nutné napsat kód implementující třídicí algoritmus, jako je Bubble Sort nebo Insertion Sort. To je často těžké, ale Python poskytuje jednodušší způsob, kterému se budeme věnovat v tomto článku.

Úvod do tříděné funkce

Funkce sort je funkce, která třídí iterovatelné položky v Pythonu. Iterovatelná je jakákoliv hodnota, kterou můžete přepínat smyčkou. Příklady iterovatelných položek zahrnují řetězce, seznamy, n-tice a množiny. Tyto iterovatelné položky jsou často neuspořádané a řazení umisťuje jejich hodnoty do určitého určeného pořadí. Řazení hodnot je užitečné, protože:

  • Vyhledávání s hodnotami je rychlejší a efektivnější pomocí algoritmů, jako je binární vyhledávání. Binární vyhledávání však vyžaduje, aby byly hodnoty nejprve seřazeny.
  • Pro zobrazení hodnot. Občas by uživatelé chtěli zobrazit informace seřazené, například podle nejnižší ceny jako prvního nebo od nejnovějšího příspěvku. To by vyžadovalo implementaci nějakého způsobu řazení seznamu hodnot.
  • Při provádění statistické analýzy například nalezení nejčastěji se vyskytující hodnoty v souboru. Je to jednodušší, když jsou hodnoty seřazeny v pořadí.

Tříděná příručka k použití funkcí

Jak již bylo zmíněno dříve, funkce sort funguje se všemi iterovatelnými. Na druhé straně vrátí seznam, který byl seřazen. To je důležité poznamenat – zatímco vstup může být libovolný iterovatelný, návratová hodnota musí být vždy seznam.

Syntaxe tříděné funkce

Signatura funkce tříděné funkce je následující:

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

Jak vidíte, jediným povinným argumentem je iterable, která bude setříděna.

Klíčem je následující argument. Klíč je funkce, která bude použita k transformaci každého prvku v iterovateli, aby se získala hodnota, která bude použita pro třídění. To bude užitečné pro třídění seznamu slovníků, jak uvidíte později. Výchozí hodnota je none, takže nebude použita žádná funkce, pokud nebude specifikována.

Poslední argument je opačný argument. Při nastavení na hodnotu true budou položky seřazeny v opačném pořadí.

V další části budu na příkladech demonstrovat, jak funkci používat.

Příklady použití tříděných funkcí

Seznam čísel

Nejjednodušším případem řazení hodnot je řazení seznamu čísel. Zvažte následující příklad kódu:

# A list of unsorted values
numbers = [8, 4, 3, 9, 2, 0, 3]

# Sorting the numbers
sorted_numbers = sorted(numbers)

# Outputting the sorted values
print(sorted_numbers)

Výstup by byl:

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

Jak vidíte, hodnoty byly seřazeny vzestupně. Pokud byste je chtěli seřadit sestupně, nastavili byste zpětný chod na true. Řádek 4 v předchozím příkladu kódu by proto byl:

sorted_numbers = sorted(numbers, reverse=True)

Výstup spuštění upraveného programu by byl:

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

Seznam strun

Funkce třídění podporuje více než jen čísla. Řetězce můžete také třídit. Chcete-li seřadit řetězce v seznamu, porovnávají se první znaky řetězců. Porovnání se provádějí na hodnotách ASCII znaků. Například „ahoj“ by bylo před slovem „svět“, protože hodnota ASCII pro „h“ je 104, což je méně než hodnota ASCII pro „w“, 119.

Pokud má jeden nebo více řetězců stejný první znak, jejich druhý a následující znaky se porovnávají, dokud není nalezeno nějaké pořadí. Zde je příklad kódu, kde třídíme jména lidí.

# Creating a list of names
members_list = ['bob', 'dave', 'charlie', 'alice']

# Sorting the names
sorted_members_list = sorted(members_list)

# Printing the names
print(sorted_members_list)

Tím vznikne následující výstup:

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

Protože se používají hodnoty ASCII, řazení řetězců závisí na tom, který znak je v tabulce ASCII na prvním místě. Například velké písmeno bude před malým písmenem, protože velká písmena jsou v ASCII před malými písmeny. Zde je kompletní tabulka ASCII pro vaši referenci:

Zdroj: commons.wikimedia.org

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

Jak jsem již zmínil, funkce sort pracuje s nejrůznějšími iterovatelnými. Stejná pravidla platí pro to, jak budou hodnoty v iterablech seřazeny. Zde je příklad:

# Printing a sorted string
print(sorted("dijkstra"))

# Printing a sorted tuple of values
print(sorted((3, 4, 2, 1, 5, 0)))

# Printing a sorted set of values
print(sorted(set([4, 5, 5, 1, 3, 8, 9])))

Výstupem z toho bude:

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

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

Seznam slovníků

Můžete také použít funkci třídění k řazení seznamu slovníků. Řazení slovníků je však trochu složitější. Je to proto, že na rozdíl od čísel nebo řetězců má slovník více vlastností, z nichž každá je stejně platná pro srovnání.

Pro řazení slovníků tedy zadáte funkci, která shrne celý slovník do jedné hodnoty, která bude použita pro porovnání. Tato funkce bude předána tříděné funkci jako klíčový argument. Zde je příklad pro ilustraci:

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é objektem slovníku. Každý objekt má název a atribut stáří. Chceme lidi řadit podle věku. Když tedy voláme setříděnou funkci, předáme funkci jako klíčový argument.

Tato funkce převezme objekt slovníku osoby a vrátí věk osoby. Návratová hodnota tohoto klíče bude použita pro řazení. Proto byl celý slovník shrnut do jednoduchého celého čísla, které lze porovnávat. Pro jednoduchost jsem k definici klíčového argumentu použil funkci lambda.

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

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

Případ použití klíčového argumentu

Klíčový argument nemusí být použit pouze při řazení slovníků. Můžete jej použít na všechny hodnoty. Jeho použití je poskytnout klíč, který lze použít k řazení hodnot. Zde jsou příklady použití:

  • Řazení hodnot pomocí definování klíčové funkce, která přebírá hodnotu a vrací délku hodnoty.
  • Třídění řetězců v seznamu bez ohledu na velikost písmen. Chcete-li to provést, každý řetězec v seznamu lze převést na malá písmena. Toho lze dosáhnout definováním funkce klíče, která přebírá hodnotu klíče řetězce a vrací verzi řetězce s malými písmeny.
  • Řazení hodnot na základě složené hodnoty, která kombinuje hodnoty jiných položek.

Složitost za běhu tříděné funkce

Seřazená funkce má běhovou složitost O(n log n), kde n je počet prvků v iterovatelném vstupu. Tato složitost vzniká, protože funkce používá algoritmus Timsort, což je hybridní třídicí algoritmus založený na slučovacím řazení a vkládání.

Prostorová složitost funkce je O(n), kde n je stále počet prvků na vstupu. Je to proto, že se vytvoří a vrátí nový seznam.

Funkce třídění vs. funkce třídění

Další možností řazení hodnot je funkce řazení. Tato část vysvětlí klíčové rozdíly mezi funkcemi třídění a třídění.

  • Funkce řazení upravuje iterovatelnou na místě, zatímco funkce třídění vytváří nový seznam a vrací jej.
  • Protože se úpravy provádějí na místě, řazení vyžaduje, aby vstupem byl seznam. Na druhou stranu, tříděný může mít jako vstup jakýkoli iterovatelný, který bude poté použit k vytvoření nového seznamu, který bude upraven a vrácen.

Závěrečná slova

V tomto článku jsme se věnovali tříděné funkci – co to je, jak ji používat a různé argumenty, které potřebuje. Také jsme se zabývali různými příklady použití funkce a její složitostí za běhu a porovnali jsme ji s funkcí řazení.

Dále si možná budete chtít přečíst náš článek o funkci součtu v Pythonu.