V našich programech budeme často potřebovat pracovat s různě strukturovanými daty, která obsahují mnoho druhů hodnot. Představme si například, že zpracováváme seznam absolventů nějakého kurzu. Každý absolvent má svoje jméno, příjmení (což jsou řetězce), rok absolvování kurzu (celé číslo), výslednou docházku v procentech (desetinné číslo) a informaci o tom, zda prospěl s vyznamenáním (pravdivostní hodnota).
Jelikož už známe seznamy, mohli bychom zkusit reprezentovat absolventa třeba takto:
absolvent = ['Petr', 'Roman', 2017, 0.95, True]
Hned ale vidíme, že z takového seznamu není úplně zřejmé, co která hodnota znamená. Musíme si pamatovat, že na indexu 0 je křestní jméno, na indexu 3 docházka apod. Mnohem pohodlnější by bylo, kdybychom mohli jednotlivé hodnoty místo indexování přímo pojmenovat. A přesně k tomuto účelu máme v Pythonu datový typ dictionaryslovník.
Slovníky
Slovník umožňuje pojmenovat hodnoty v nějaké datové struktuře tak, abychom pomocí těchto jmen mohli k hodnotám poté přistupovat. Našeho absolventa bychom pomocí slovníku reprezentovali takto
absolvent = {
'jmeno': 'Petr',
'prijmeni': 'Roman',
'rok': 2017,
'dochazka': 0.95,
'vyznamenani': True
}
Pokud pak chceme získat například jméno či docházku našeho absolventa, píšeme
>>> absolvent['jmeno']
'Petr'
>>> absolvent['dochazka']
0.95
První důležitá věc ohledně slovníků je, že slovníky jsou opět hodnoty jako každé jiné. Mohou proto být součástí seznamů. Můžeme tedy snadno vyrobit seznam absolventů našeho kurzu:
absolventi = [
{'jmeno': 'Petr', 'prijmeni': 'Roman', 'rok': 2017, 'dochazka': 0.95, 'vyznamenani': True},
{'jmeno': 'Jana', 'prijmeni': 'Kočanská', 'rok': 2015, 'dochazka': 0.92, 'vyznamenani': True},
{'jmeno': 'Eva', 'prijmeni': 'Horká', 'rok': 2014, 'dochazka': 0.85, 'vyznamenani': False},
{'jmeno': 'Ivo', 'prijmeni': 'Roubeník', 'rok': 2017, 'dochazka': 0.75, 'vyznamenani': False}
]
Kdybychom pak chtěli získat například příjmení absolventa na indexu 2, psali bychom
>>> absolventi[2]['prijmeni']
'Horká'
Nebo bychom mohli projít všechny absolventy a spočítat jejich průměrnou docházku na kurz.
>>> from statistics import mean
>>> mean([ab['dochazka'] for ab in absolventi])
0.8765
Složitější struktury
Stejně jako u proměnných a seznamů můžeme do slovníku uložit jakoukoliv hodnotu. Není tedy problém mít ve slovníku seznam nebo další slovník. Tím se otvírá prostor pro mnohem komplikovanější datové struktury. Takto bychom mohli reprezentovat například kurz Czechitas jménem Úvod do programování.
kurz = {
'nazev': 'Úvod do programování',
'lektor': 'Martin Podloucký',
'konani': [
{
'misto': 'T-Mobile',
'koucove': [
'Dan Vrátil',
'Filip Kopecký',
'Martina Nemčoková'
],
'ucastnic': 30
},
{
'misto': 'MSD IT',
'koucove': [
'Dan Vrátil',
'Zuzana Tučková',
'Martina Nemčoková'
],
'ucastnic': 25
},
{
'misto': 'Škoda DigiLab',
'koucove': [
'Dan Vrátil',
'Filip Kopecký',
'Kateřina Kalášková'
],
'ucastnic': 41
}
]
}
Všimněte si, jak slovník představující jeden kurz, obsahuje pod klíčem konani
seznam dalších slovníků. Každý z nich reprezentuje jedno konání kurzu a dále obsahuje například seznam koučů atd. Kdybychom tedy například chtěli seznam všech koučů na druhém konání kurzu, napsali bychom
kurz['konani'][1]['koucove']
Cvičení: Slovníky
Kurz
Založte si program v Pythonu a zkopírujte si do něj datovou strukturu kurzu Úvod do programování z lekce výše.
- Vypište na výstup počet účastnic na posledním konání kurzu.
- Vypište na výstup jméno posledního kouče na prvním konání kurzu.
- Vypište na výstup celkový počet konání kurzu.
- Vypište na výstup všechna místa, na kterých se kurz konal. Použijte chroustání seznamů.
Knihovna
Uvažte, jak byste pomocí slovníku reprezentovali údaje o knize v knihovně. Jaké klíče a hodnoty ve slovníku budou? Zcela jistě bude každá kniha obsahovat například název. Chtěli bychom také, aby kniha umožňovala mít vícero autorů a vícero vydání. Ve vašem programu vytvořte proměnnou, který bude obsahovat jednu knihu s vámi vymyšlenou strukturou.
Bonusy
Recepty
Pohlédněte na následující reprezentaci receptu:
{
'nazev': 'Batáty se šalvějí a pancettou',
'narocnost': 'stredni',
'doba': 30,
'ingredience': [
['batát', '1', '15 kč'],
['olivový olej', '2 lžíce', '2 kč'],
['pancetta', '4-6 plátků', '21 kč'],
['přepuštěné máslo', '2 lžíce', '5 kč'],
['mletý černý pepř', '1/2 lžičky', '0.5 kč'],
['sůl', '1/2 lžičky', '0.1 kč'],
['muškátový oříšek', 'špetka', '1 kč'],
['česnek', '2 stroužky', '1 kč'],
['šalvějové lístky', '20-25', '12 kč']
]
}
Uložte si tuto strukturu do proměnné recept na začátek nového programu. Vypište pomocí funkce print
kolik bude celé jídlo stát korun zaokrouhlené na celé koruny nahoru.