Seznamy jsou velmi užitečná datová struktura, protože umožňují ukládat spoustu dat do jedné proměnné. Pokud do nich ale ukládáme informace různého typu, může brzy vzniknout chaos. Podívejme se třeba seznam, který obsahuje informace o položce v e-shopu.

["Čajová konvička s hrnky", 899, True]

Dokázali bychom asi odhadnout, že první prvek je název a druhý cena. Co však znamená True? To za seznamu na první pohled patrné není. Samozřejmě by bylo možné tu informaci někam poznamenat, ale možná by stálo za to mít tu informaci přímo v sekvenci.

A přesně toto řeší datový typ slovník (dict).

O slovnících

Princip slovníků skutečně vychází z papírových slovníků, kde je každý záznam identifikován pomocí nějakého slova a k tomuto slovu jsou přiřazená nějaká data (nejčastěji textový popis). Na podobném principu fungují třeba i muzea, kde exponáty mají štítky s popisky.

Na rozdíl od seznamů nemají slovníky indexy, ale klíče (key). Jako klíče mohou sloužit datové typy int, float, bool string (a další, které zatím neznáme). Nejčastěji se přirozeně používají řetězce. Každý klíč má přiřazenou hodnotu. Hodnotou může být libovolný datový typ.

Vezměme nyní náš seznam s informacemi o položce v e-shopu a převeďme ho na slovník.

item = {"title": "Čajová konvička s hrnky", "price": 899, "inStock": True}

Takový zápis je jistě mnohem srozumitelnější. Nyní vidíme, že poslední hodnota označuje, zda je položka skladem. Všimni si, že slovníky zapisujeme do složených závorek, mezi klíčem a hodnotou je dvojtečka a jednotlivé dvojice jsou odděleny čárkami.

Ze slovníku můžeme snadno získat jednu jeho hodnotu. K tomu použijeme hranaté závorky, do kterých zapíšeme klíč.

title = item['title']

Zkusme si třeba vypsat informace o položce.

print(f"Vybraný předmět je {item['title']} a stojí {item['price']} Kč.")

Pozor: Při použití f-stringů je nutné uvnitř hranatých závorek použít jiný typ označení řetězců. Začínáte-li text pomocí uvozovek, pro klíče slovníku použijte apostrofy.

Funkci print můžeme použít i na celý slovník. Python pak použije standardní výpis, který vypadá stejně, jako když slovník zapisujeme. Hodí se to, když potřebujeme zkontrolovat, co vlastně ve slovníku je.

{'title': 'Čajová konvička s hrnky', 'price': 899, 'inStock': True}

K ověření, jestli nějaký klíč už ve slovníku je, použijeme operátor in, jako tomu bylo v případě seznamu. Pouze namísto indexu vkládáme klíč.

item = {"title": "Čajová konvička s hrnky", "price": 899, "inStock": True}
if "weight" in item:
  print(f"Hmotnost předmětu je {item['weight']} kg.")
else:
  print("Hmotnost není zadána.")

Snadno můžeme nějakou existující hodnotu upravit nebo přidat novou.

item['price'] = 929
item['weight'] = 0.4

Jako klíče slovníku používat i proměnné.

key = 'price'
item[key] = 929

Prázdný slovník vytvoříme pomocí prázdných složených závorek, tedy například:

item = {}

Zkusme si ještě jeden motivační příklad. Uvažujme například, že chystáme firemní výlet a chceme nakoupit špekáčky pro kolegy. Abychom věděli, kolik jich máme celkem koupit, vytvoříme si slovník a pro každého z kolegů a kolegyň si budeme evidovat, kolik špekáčků plánují během výletu sníst.

sausages = {"Jirka": 2, "Naty": 1, "Adam": 4, "Lucka": 2, "Pavča": 2}

Počet kolegů, kteří jdou na párty, zjistíme pomocí nám již známé funkce funkce len.

print(len(sausages))

Uvažujme například, že se Naty na poslední chvíli omluví. Upravíme tedy hodnotu s klíčem Naty na 0.

sausages["Naty"] = 0
print(len(sausages))

Drobnou nevýhodou je, že funkce len bude stále vracet hodnotu 5, protože klíč Naty je ve slovníku stále přítomen. Alternativně můžeme klíč ze slovníku úplně vyřadit. K tomu slouží funkce pop.

sausages.pop("Naty")

Nyní funkce len vrátí 4.

Slovníky

1

Vysvědčení

pohodička

Vytvoř slovník, který reprezentuje vysvědčení. Klíč slovníku bude název předmětu a hodnota známka z daného předmětu. Pro zjednodušení vlož do slovníku pouze tři předměty (například český jazyk, matematiku a dějepis). Vypiš obsah slovníku pomocí funkce print().

2

Detektivky

to dáš

Vydavatel detektivek si eviduje prodané kusy u jednotlivých knih. V následujícím slovníku najdeš tři knihy a u každé z nich je počet prodaných kusů.

sales = {
    "Zkus mě chytit": 4165,
    "Vrah zavolá v deset": 5681,
    "Zločinný steh": 2565,
}
  • Zkopíruj si slovník do svého programu.
  • Přidej do slovníku nově vydanou detektivku "Noc, která mě zabila", která zatím nebyla uvedena na trh, je tedy prodáno 0 kusů.
  • U knihy "Vrah zavolá v deset" zvyš počet prodaných kusů o 100.
3

Tombola

zapni hlavu

V následujícím slovníku jsou uložena čísla lístků tomboly a příslušné výhry.

tombola = {
    7: "Láhev kvalitního vína Château Headache",
    15: "Pytel brambor z místního družstva",
    23: "Čokoládový dort",
    47: "Kniha o historii města",
    55: "Šiška salámu",
    67: "Vyhlídkový let balónem",
    79: "Moderní televizor",
    91: "Roční předplatné městského zpravodaje",
    93: "Společenská hra Sázky a dostihy",
}
  • Napiš program, který se nejprve zeptá uživatele na číslo jeho lístku. Vstup uživatele si převeď na int!
  • Zkontroluj, zda je číslo lístku ve slovníku. Pokud ne, vypiš text "Bohužel nevyhráváš nic." Pokud číslo ve slovníku je, vypiš uživateli, co vyhrál.
  • Odeber výhru pro daný lístek ze slovníku, abychom tam evidovali pouze nevydané ceny.
Bonusová cvičení
Nepovinné úložky, které můžete řešit pokud máte chuť na větší výzvu nebo si chcete látku procvičit víc do hloubky.
4

Paranoidní večírek.

zavařovačka

Pořadatel našeho večírku se stává stále více paranoidním a nyní rozhodl, že každý z hostů bude mít speciální heslo, které je platné jen pro něj. Seznam hostů a jejich hesel je níže. Napiš program, který nejprve zkontroluje, zda je host na seznamu, a pokud tam je, zeptá se ho na heslo a zkontroluje jeho správnost. Hostu na seznamu, který zadá správné heslo, vypíše program text: “Smíš vstoupit.”

passwords = {"Jiří": "tajne-heslo", "Natálie": "jeste-tajnejsi-heslo", "Klára": "nejtajnejsi-heslo"}