2022-09-11 15:23 Doba čtení: 12 min

Jak seřadit pythonovský slovník podle klíče nebo hodnoty

V tomto návodu si ukážeme, jak efektivně seřadit slovník v Pythonu, a to buď podle jeho klíčů, nebo podle hodnot.

Při práci se slovníky v Pythonu se občas dostanete do situace, kdy potřebujete seřadit jejich obsah – ať už dle klíčů, nebo dle hodnot. Jelikož slovník v Pythonu představuje mapování mezi klíčem a hodnotou, budeme vytvářet nový slovník, jehož klíče nebo hodnoty budou uspořádány dle našeho požadavku.

Nejprve si zopakujeme základy práce se slovníky v Pythonu. Poté se podíváme na to, jak vytvořit nový slovník seřazený dle klíčů nebo hodnot.

Opakování základů slovníků v Pythonu

Co je to slovník v Pythonu?

Slovník je vestavěná datová struktura v Pythonu, která uchovává data v párech klíč-hodnota. Hodnoty lze vyhledávat pomocí klíčů. Klíče jsou unikátní, takže by se neměly opakovat.

py_dict = {"Python":"skvělý!","Učit se":True}
py_dict["Python"]
# Výstup: skvělý!

py_dict["Učit se"]
# Výstup: True

Funkčně je slovník podobný hashovací tabulce. Z povahy věci není seřazený. K obsahu slovníku můžete přistupovat v libovolném pořadí, pokud znáte klíče.

Uspořádání prvků ve slovníku

Ve starších verzích Pythonu bylo nutné použít OrderedDict pro zachování pořadí klíčů. Od verze Python 3.7 však můžete k prvkům přistupovat v tom pořadí, v jakém byly do slovníku vloženy.

Nyní, když už máte základní znalosti o slovnících v Pythonu, podívejme se na to, jak vytvářet seřazené kopie slovníků.

⚙️ Poznámka: Aby kód v tomto tutoriálu fungoval tak, jak je zamýšleno, musíte mít Python 3.7 nebo novější. Nejnovější verzi si můžete stáhnout zde, nebo spustit příklady v online editoru Pythonu.

Jak seřadit slovník v Pythonu podle klíče

Podívejte se na následující obrázek jídelního lístku s dezerty v kavárně. Jednotlivé položky a jejich ceny jsou uvedeny ve dvou sloupcích.

Tyto údaje můžeme reprezentovat ve formě slovníku Pythonu, kde názvy položek budou klíči a jejich ceny hodnotami.

Vytvořme si tedy slovník s názvem "dezerty", jak je ukázáno níže.

dezerty = {
    "Zmrzlina":10,
    "Brownies":12,
    "Cheesecake":3,
    "Švýcarský rolád":5,
    "Sušenky":4,
    "Cupcake":2
}

Nyní vytvoříme nový slovník `serazene_dezerty`, kde budou dezerty seřazeny abecedně. V původním slovníku "dezerty" jsou klíči názvy dezertů. Pro vytvoření nového slovníku tedy seřadíme tyto klíče abecedně.

Jak získat klíče slovníku v Pythonu

Nejprve získáme klíče slovníku a poté je seřadíme abecedně.

K získání seznamu všech klíčů ve slovníku můžete použít vestavěnou metodu .keys() slovníku v Pythonu.

Zavolejte metodu .keys() na slovníku "dezerty", abyste získali klíče, jak je znázorněno níže.

klice = dezerty.keys()
print(klice)

#Výstup
['Zmrzlina', 'Brownies', 'Cheesecake', 'Švýcarský rolád', 'Sušenky', 'Cupcake']

Volání vestavěné funkce sorted() v Pythonu s argumentem seznamu vrátí nový seřazený seznam.

Dále zavoláme funkci sorted() s klíči seznamu jako argumentem a uložíme seřazený seznam do proměnné `serazene_klice`.

serazene_klice = sorted(klice)
print(serazene_klice)

# Výstup
['Brownies', 'Cheesecake', 'Cupcake', 'Sušenky', 'Švýcarský rolád', 'Zmrzlina']

Nyní, když máme klíče seřazené abecedně, můžeme vyhledat hodnoty odpovídající klíčům v `serazene_klice` ze slovníku "dezerty", jak je ukázáno níže.

serazene_dezerty = {}
for klic in serazene_klice:
  serazene_dezerty[klic] = dezerty[klic]

print(serazene_dezerty)

# Výstup
{'Brownies': 12, 'Cheesecake': 3, 'Cupcake': 2, 'Sušenky': 4, 'Švýcarský rolád': 5, 'Zmrzlina': 10}

Podívejme se na výše uvedený kód podrobněji:

  • Inicializujeme `serazene_dezerty` jako prázdný slovník v Pythonu.
  • Procházíme seznam klíčů `serazene_klice`.
  • Pro každý klíč v `serazene_klice` přidáme položku do `serazene_dezerty` vyhledáním odpovídající hodnoty ve slovníku "dezerty".

Použití cyklu for tímto způsobem je považováno za poněkud zdlouhavé. V Pythonu existuje stručnější alternativa s využitím tzv. "dictionary comprehension" (konstruktoru slovníků).

Konstruktor slovníku v Pythonu

Python podporuje použití "dictionary comprehension", podobně jako "list comprehension" (konstruktor seznamů). "Dictionary comprehension" vám umožňuje vytvořit nový slovník v Pythonu pomocí jediného řádku kódu.

▶️ Zde je obecný konstrukt pro použití "dictionary comprehension" v Pythonu.

# 1. když máte klíče a hodnoty ve dvou seznamech: seznam1, seznam2
novy_slovnik = {klic:hodnota for klic,hodnota in zip(seznam1,seznam2)}

# 2. když máte klíče a můžete vyhledat hodnoty
novy_slovnik = {klic:hodnota for klic in <iterable>}

Použijeme druhý konstrukt uvedený výše: `novy_slovnik = {klic:hodnota for klic in }` k vytvoření slovníku `serazene_dezerty`.

V tomto příkladu:

  • iterovatelné: seznam `serazene_klice`
  • klic: klíč, ke kterému přistupujeme při procházení přes `serazene_klice`
  • hodnota: vyhledání hodnoty odpovídající klíči ze slovníku "dezerty", `dezerty[klic]`

Když to dáme dohromady, máme výraz pro "dictionary comprehension", jak je uvedeno níže.

serazene_dezerty = {klic:dezerty[klic] for klic in serazene_klice}
print(serazene_dezerty)

{'Brownies': 12, 'Cheesecake': 3, 'Cupcake': 2, 'Sušenky': 4, 'Švýcarský rolád': 5, 'Zmrzlina': 10}

Z výše uvedeného výstupu jsou dezerty seřazeny abecedně ve slovníku `serazene_dezerty`.

Jak seřadit slovník v Pythonu podle hodnoty

Nyní se podíváme na to, jak seřadit slovník v Pythonu podle jeho hodnot.

Ve slovníku "dezerty" hodnoty odpovídají cenám dezertů. Možná budete chtít seřadit slovník podle cen, a to buď vzestupně, nebo sestupně.

▶️ K získání všech párů klíč-hodnota můžete použít vestavěnou metodu .items(). Každá n-tice je pár klíč-hodnota.

dezerty.items()

dict_items([('Zmrzlina', 10), ('Brownies', 12), ('Cheesecake', 3), ('Švýcarský rolád', 5), ('Sušenky', 4), ('Cupcake', 2)])

Každá z položek je sama o sobě n-tice. Můžete tedy také indexovat do každého páru klíč-hodnota a přistupovat ke klíčům a hodnotám jednotlivě.

dict_items = dezerty.items()
for polozka in dict_items:
  print(f"klic:{polozka[0]},hodnota:{polozka[1]}")

# Výstup
klic:Zmrzlina,hodnota:10
klic:Brownies,hodnota:12
klic:Cheesecake,hodnota:3
klic:Švýcarský rolád,hodnota:5
klic:Sušenky,hodnota:4
klic:Cupcake,hodnota:2

Protože chceme třídit podle hodnot, použijeme výše uvedenou metodu pro získání hodnoty na indexu 1 v páru klíč-hodnota.

Jak seřadit hodnoty slovníku Python vzestupně

Tentokrát použijeme funkci sorted() spolu s volitelným parametrem `key`. `key` může být libovolná funkce v Pythonu, vestavěná funkce, uživatelsky definovaná funkce nebo i lambda funkce.

Poznámka: `lambda args: expression` je syntaxe pro definování lambda funkcí v Pythonu.

V tomto příkladu seřazování dezertů podle ceny chceme přistupovat k položkám slovníku (páry klíč-hodnota). Nastavíme `key=lambda polozka: polozka[1]`, jelikož chceme řadit podle hodnot (cen).

Jelikož funkce `sorted()` ve výchozím nastavení vrací seznam, měli byste jej explicitně přetypovat na slovník, jak je uvedeno níže.

serazene_dezerty = dict(sorted(dezerty.items(), key=lambda polozka:polozka[1]))
print(serazene_dezerty)

{'Cupcake': 2, 'Cheesecake': 3, 'Sušenky': 4, 'Švýcarský rolád': 5, 'Zmrzlina': 10, 'Brownies': 12}

Můžete to také přepsat pomocí "dictionary comprehension", jak bylo diskutováno dříve.

serazene_dezerty = {klic:hodnota for klic, hodnota in sorted(dezerty.items(), key=lambda polozka:polozka[1])}

print(serazene_dezerty)

# Výstup
{'Cupcake': 2, 'Cheesecake': 3, 'Sušenky': 4, 'Švýcarský rolád': 5, 'Zmrzlina': 10, 'Brownies': 12}

V `serazene_dezerty` je "Cupcake" s cenou 2 $ první položkou a "Brownies" za 12 $ je poslední položkou.

Jak seřadit hodnoty slovníku Python sestupně

Pokud chcete seřadit ceny sestupně, můžete nastavit volitelný parametr `reverse` na `True`, jak je vysvětleno níže.

serazene_dezerty = dict(sorted(dezerty.items(), key=lambda polozka:polozka[1], reverse=True))
print(serazene_dezerty)

# Výstup
{'Brownies': 12, 'Zmrzlina': 10, 'Švýcarský rolád': 5, 'Sušenky': 4, 'Cheesecake': 3, 'Cupcake': 2}

Nyní jsou `serazene_dezerty` seřazeny sestupně podle cen, počínaje nejdražším dezertem "Brownies" za 12 dolarů.

Závěrem 👩🏽‍💻

Pojďme si rychle shrnout vše, co jsme se v tomto tutoriálu naučili.

  • Slovník v Pythonu uchovává data v párech klíč-hodnota; všechny klíče by měly být unikátní.
  • Při řazení slovníku podle klíče nebo hodnoty vytváříme nový slovník seřazený dle potřeby.
  • K načtení všech klíčů a párů klíč-hodnota můžete použít vestavěné metody slovníku, .keys() a .items().
  • K dosažení požadovaného řazení můžete použít funkci sorted() spolu s volitelnými parametry `key` a `reverse`.

Nyní, když už umíte seřadit slovník v Pythonu, naučte se, jak seřadit seznamy v Pythonu. Přeji vám příjemné kódování! 🎉

Tomáš Dvořák
Autor
Czechia

Píše o bezpečnosti, webu a chytrých službách s důrazem na srozumitelnost.

Předchozí článek
Vše, co byste měli vědět v roce 2022
Další článek
10 cloudových nástrojů pro testování napříč prohlížeči [2022]