Slovníky, JSON

Díky slovníkům dokážeme v našem programu zpracovávat složitěji strukturovaná data a díky formátu JSON je můžeme snadno ukládat nebo například stahovat z internetu.

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

1

Kurz

pohodička

Založte si program v Pythonu a zkopírujte si do něj datovou strukturu kurzu Úvod do programování z lekce výše.

  1. Vypište na výstup počet účastnic na posledním konání kurzu.
  2. Vypište na výstup jméno posledního kouče na prvním konání kurzu.
  3. Vypište na výstup celkový počet konání kurzu.
  4. Vypište na výstup všechna místa, na kterých se kurz konal. Použijte chroustání seznamů.
2

Knihovna

zapni hlavu

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

3

Recepty

zapni hlavu

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.