📖 Slovníky a množiny

Telefonní seznam

O čem to je

V telefonu nehledáš číslo podle pořadí („dej mi 57. kontakt“). Hledáš podle jména: „Máma“. Jméno je klíč, číslo je hodnota, která k němu patří.

Přesně tak funguje slovník v Pythonu. Hodí se všude, kde k něčemu patří něco jiného: zboží → cena, žák → známka, slovo → překlad. A druhá užitečná struktura, množina, hlídá, aby se nic neopakovalo.

Nové pojmy

Slovník (dict)Kolekce dvojic klíč: hodnota ve složených závorkách. Hodnotu najdeš podle klíče, ne podle pořadí.ceny = {"jablko": 25, "hruska": 30}
KlíčJednoznačné „jméno“ hodnoty ve slovníku. Každý klíč je ve slovníku nejvýš jednou. Klíčem bývá řetězec nebo číslo (musí být neměnný)."jablko"
HodnotaÚdaj, který patří ke klíči. Hodnoty se opakovat smí a mohou být libovolného typu.25
Množina (set)Neuspořádaná kolekce, ve které je každý prvek jen jednou. Píše se do složených závorek bez dvojteček.{1, 2, 2, 3} je ve skutečnosti {1, 2, 3}.

Práce se slovníkem

ZápisCo uděláceny = {"jablko": 25, "hruska": 30}
ceny["jablko"]hodnota pro klíč25
ceny["banan"] = 10přidá novou dvojici3 dvojice
ceny["jablko"] = 20přepíše hodnotu existujícího klíčejablko stojí 20
del ceny["hruska"]smaže dvojicihruška zmizí
"hruska" in cenyje tam klíč?True
ceny.get("kiwi", 0)hodnota, nebo náhradní hodnota0

Průchod slovníkem

  • for zbozi, cena in ceny.items():
  •     print(f"{zbozi}: {cena} Kč")

Metoda items() dává dvojice klíč–hodnota. Samotné for k in ceny: prochází jen klíče.

Spočítej, kolikrát se v seznamu ["a", "b", "a", "c", "a"] opakuje každé písmeno.
pocty = {}, pak for p in seznam: → pocty[p] = pocty.get(p, 0) + 1. get vrátí dosavadní počet, nebo 0, když písmeno ještě nebylo. Výsledek: {'a': 3, 'b': 1, 'c': 1}.
Co se stane po ceny["kiwi"], když kiwi ve slovníku není?
Chyba KeyError. Bezpečně: if "kiwi" in ceny: nebo ceny.get("kiwi"), které vrátí None.
✗ceny[0] vrátí první dvojici ze slovníku.
✓Hodnotu získáš přes klíč: ceny["jablko"].

Slovník se neindexuje pořadím, ale klíči. ceny[0] hledá klíč 0 a skončí chybou KeyError.

Slovník ukládá dvojice klíč: hodnota a hodnotu najdeš podle klíče. Klíče jsou jedinečné. get vrátí náhradní hodnotu místo chyby, items() dává dvojice pro cyklus.

Kdy co použít

O čem to je

Kuchař má šuplíky na příbory, kořenky se jmény a misku na zbytky. Každá nádoba se hodí na něco jiného. V Pythonu jsou čtyři základní „nádoby“ na data a dobrý programátor ví, kterou kdy vzít.

Tady porovnáš seznam, n-tici, slovník a množinu. Hlavně se naučíš množiny a jejich operace, které znáš z matematiky.

Nové pojmy

KolekceDatová struktura, která v jedné proměnné drží víc hodnot.seznam, n-tice, slovník, množina
SlovníkDvojice klíč: hodnota v { }. Hledá se podle klíče, klíče se neopakují.{"CZ": "Praha", "SK": "Bratislava"}
MnožinaPrvky v { } bez opakování a bez pořadí. Nemá indexy. Prázdná množina je set(), protože {} je prázdný slovník.set("banan") je {'b', 'a', 'n'} (pořadí může být jiné).
N-tice (tuple)Jako seznam, ale v kulatých závorkách a neměnná. Hodí se na údaje, které k sobě pevně patří.bod = (3, 4)
StrukturaZápisPořadíOpakováníMěnitelnáHledání
seznam[1, 2]anoanoanopodle indexu
n-tice(1, 2)anoanonepodle indexu
slovník{"a": 1}pořadí vloženíklíče neanopodle klíče
množina{1, 2}neneanojen „je tam?“

Operace s množinami

Pro a = {1, 2, 3} a b = {2, 3, 4}:

OperaceZápisVýsledek
sjednocení (vše z obou)a | b{1, 2, 3, 4}
průnik (v obou)a & b{2, 3}
rozdíl (v a, ne v b)a - b{1}
symetrický rozdíl (jen v jedné)a ^ b{1, 4}
Kolik různých čísel je v seznamu [1, 1, 2, 2, 3]?
len(set([1, 1, 2, 2, 3])). Množina zahodí opakování: {1, 2, 3}, tedy 3.
Které předměty mají Eva i Petr? Eva: {"M", "ČJ", "IT"}, Petr: {"IT", "AJ", "M"}.
Průnik eva & petr = {"M", "IT"}.

Roztřiď úlohy podle toho, která struktura se na ně hodí nejlépe.

✗prazdna = {} vytvoří prázdnou množinu.
✓prazdna = set()

Složené závorky bez obsahu znamenají prázdný slovník, protože slovník byl v Pythonu dřív.

Seznam = pořadí, slovník = hledání podle klíče, množina = jedinečné prvky bez pořadí, n-tice = neměnný seznam. Množiny umí sjednocení |, průnik & a rozdíl -.