Slovník (typ dict) uchováva dvojice kľúč → hodnota. Funguje ako skutočný slovník alebo telefónny zoznam: podľa kľúča (slova, mena) rýchlo nájdeš hodnotu (preklad, číslo). Kým v zozname hľadáme prvky podľa poradového čísla, v slovníku ich hľadáme podľa zmysluplného kľúča – napríklad body podľa mena alebo počet výskytov podľa slova.
Čo sa naučíš
- vytvoriť slovník, čítať, pridávať, meniť a mazať hodnoty podľa kľúča,
- bezpečne čítať hodnoty metódou
get, - prechádzať slovník (
keys,values,items), - počítať výskyty pomocou slovníka.
1Kľúče a hodnoty
Slovník zapíšeme do zložených zátvoriek ako dvojice kľúč: hodnota oddelené čiarkou:
>>> ceny = {"chlieb": 1.89, "mlieko": 0.99, "maslo": 2.49} >>> ceny["mlieko"] 0.99 >>> len(ceny) 3 >>> prazdny = {} >>> len(prazdny) 0
K hodnote sa dostaneme zápisom slovnik[kľúč]. Ak kľúč v slovníku nie je, nastane chyba KeyError:
>>> ceny = {"chlieb": 1.89, "mlieko": 0.99} >>> ceny["syr"] KeyError: 'syr'
1.1Pridanie, zmena a odstránenie
Priradením do nového kľúča dvojicu pridáme, do existujúceho kľúča hodnotu zmeníme. Príkaz del (alebo metóda pop) dvojicu odstráni:
Výstup:
{'Ema': 18, 'Ján': 17}1.2Pravidlá pre kľúče
- Každý kľúč je v slovníku najviac raz; nové priradenie do toho istého kľúča prepíše hodnotu.
- Kľúčom musí byť nemenná hodnota: reťazec, číslo, n-tica. Zoznam kľúčom byť nemôže.
- Hodnoty môžu byť čokoľvek – aj zoznamy alebo ďalšie slovníky (téma Zložitejšie dátové štruktúry).
- Slovník si pamätá poradie, v akom boli kľúče vložené.
1.3Je kľúč v slovníku?
Operátor in sa pri slovníku pýta na kľúče (nie na hodnoty):
>>> ceny = {"chlieb": 1.89, "mlieko": 0.99} >>> "chlieb" in ceny True >>> "syr" in ceny False >>> 0.99 in ceny False >>> 0.99 in ceny.values() True
1.4Bezpečné čítanie: get
Metóda get(kľúč, náhrada) vráti hodnotu, a ak kľúč chýba, vráti náhradnú hodnotu – bez chyby. Ak náhradu nezadáš, vráti None:
>>> ceny = {"chlieb": 1.89, "mlieko": 0.99} >>> ceny.get("chlieb", 0) 1.89 >>> ceny.get("syr", 0) 0 >>> print(ceny.get("syr")) None
2Prechádzanie slovníka
| Zápis | Čo prechádza |
|---|---|
for k in d: | kľúče |
for k in d.keys(): | kľúče (to isté, iba výslovne) |
for v in d.values(): | hodnoty |
for k, v in d.items(): | dvojice (kľúč, hodnota) |
Výstup:
Ema Ján Sofia
Súčet bodov: 135
Ema: 47 bodov
Ján: 38 bodov
Sofia: 50 bodovZoznam kľúčov alebo hodnôt dostaneš ako list(d) alebo list(d.values()). Zoradené kľúče: sorted(d).
2.1Zoradenie podľa hodnoty a najväčšia hodnota
Funkciám max, min a sorted sa dá povedať, podľa čoho majú porovnávať (parameter key). max(d, key=d.get) vráti kľúč s najväčšou hodnotou:
Výstup:
Najviac bodov: Sofia 50
Sofia 50
Ema 47
Tomáš 44
Ján 383Počítanie výskytov
Najčastejšie použitie slovníka: zistiť, koľkokrát sa ktorá hodnota vyskytuje. Kľúčom je hodnota, ktorú počítame, hodnotou je počet. Pri prvom výskyte kľúč v slovníku ešte nie je – preto get(kľúč, 0):
Výstup:
{'a': 5, 'b': 2, 'r': 2, 'k': 1, 'd': 1}Ten istý postup s podmienkou (dlhší, ale možno názornejší):
Výstup:
pes 3
mačka 2
vták 14Riešené úlohy
4.1Telefónny zoznam
Zadanie: Vytvor jednoduchý telefónny zoznam. Program načíta meno a vypíše číslo, alebo oznámi, že meno v zozname nie je.
Výstup:
Koho hľadáš? Ján Ján má číslo 0902 333 444
4.2Najčastejšie slovo
Zadanie: V texte nájdi slovo, ktoré sa vyskytuje najčastejšie (veľké a malé písmená ani interpunkciu nerozlišuj).
Riešenie: Text prevedieme na malé písmená, odstránime čiarky a bodky, rozdelíme na slová a spočítame ich výskyty. Najčastejšie slovo je kľúč s najväčšou hodnotou.
Výstup:
mačka 2Ak má viac slov rovnaký najvyšší počet, max vráti to, ktoré sa v slovníku objavilo skôr.
4.3Nákupný košík
Zadanie: Cenník je slovník tovar → cena. Košík je zoznam nakúpených položiek (môžu sa opakovať). Vypočítaj cenu nákupu a vypíš položky, ktoré v cenníku nie sú.
Výstup:
Nie je v cenníku: čokoláda
Spolu: 3.93 €4.4Prekladový slovník
Zadanie: Prelož vetu slovo po slove pomocou slovníka. Slová, ktoré v slovníku nie sú, nechaj nepreložené.
Výstup:
I have a dog and a cat domaMetóda get(slovo, slovo) vráti preklad, a ak preklad chýba, vráti samotné slovo.
4.5Známky v triede
Zadanie: Ku každému menu patrí zoznam známok. Vypíš priemer pre každé meno na dve desatinné miesta.
Výstup:
Ema 1.25
Ján 3.00
Sofia 1.805Časté chyby
- Čítanie neexistujúceho kľúča (
d["x"]) skončíKeyError– použiinaleboget. inhľadá kľúče, nie hodnoty – na hodnoty použiin d.values().- Prázdny slovník je
{}, prázdna množina jeset(). - Zoznam ako kľúč nie je možný (
TypeError: unhashable type: 'list') – použi n-ticu. - Zmena slovníka počas prechádzania (pridávanie alebo mazanie kľúčov v cykle
for k in d) skončí chybou; prechádzaj radšej kópiulist(d).
Zhrnutie
- Slovník
{kľúč: hodnota, ...}; prístupd[kľúč], pridanie či zmenad[kľúč] = hodnota, odstráneniedel d[kľúč]. - Kľúče sú jedinečné a nemenné (reťazce, čísla, n-tice); hodnoty môžu byť čokoľvek.
kľúč in dtestuje kľúče;d.get(kľúč, náhrada)číta bez chyby.- Prechádzanie:
for k in d,d.values(),for k, v in d.items(). - Počítanie výskytov:
pocty[x] = pocty.get(x, 0) + 1. - Kľúč s najväčšou hodnotou:
max(d, key=d.get).
Úlohy na precvičenie
- Načítaj vetu a vypíš, koľkokrát sa v nej vyskytuje každé písmeno (bez medzier), abecedne.
- Vytvor slovník mesto → teplota pre päť miest a vypíš najteplejšie a najchladnejšie mesto.
- Načítavaj dvojice „meno body“, kým sa nezadá prázdny riadok; ak sa meno zopakuje, body sa sčítajú. Na konci vypíš poradie.
- Spočítaj, koľko čísel v náhodnom zozname 100 hodov kockou padlo na každú stranu kocky.
- Vytvor „obrátený“ slovník – z
{"pes": "dog"}urob{"dog": "pes"}.