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
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í! 🎉