Další základní datový typ, který si představíme –
po číslech, řetězcích, seznamech a n-ticích –
jsou slovníky (angl. dictionary, dict
).
Podobně jako seznamy, slovníky v sobě obsahují další hodnoty. Na rozdíl od seznamů, ve kterých jsou všechny prvky uspořádané do jedné sekvence, ve slovnících máme dva druhy prvků: takzvaný klíč (angl. key) a hodnotu (angl. value). Každému klíči je přiřazena jedna hodnota.
Slovník můžeš použít, když máš několik kousků informací, které se dají pojmenovat, ale chceš s nimi pracovat jako s jednou proměnnou.
Tady je slovník, který má tři klíče, a k nim příslušné tři hodnoty:
>>> ja = {'jméno': 'Anna', 'město': 'Brno', 'čísla': [3, 7]}
Hodnoty ze slovníku můžeš získat podobně jako ze seznamu, jen místo indexu (pozice) použiješ klíč:
>>> ja['jméno']
'Anna'
Zeptáš-li se na neexistující klíč, nebude se to Pythonu líbit:
>>> ja['věk']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'věk'
Hodnoty jdou podle klíče i měnit:
>>> ja['čísla'] = [3, 7, 42]
>>> ja
{'jméno': 'Anna', 'město': 'Brno', 'čísla': [3, 7, 42]}
... nebo přidávat:
>>> ja['jazyk'] = 'Python'
>>> ja
{'jméno': 'Anna', 'město': 'Brno', 'čísla': [3, 7, 42], 'jazyk': 'Python'}
... nebo ubírat příkazem del
, podobně jako u seznamů:
>>> del ja['čísla']
>>> ja
{'jméno': 'Anna', 'město': 'Brno', 'jazyk': 'Python'}
Trochu jiné použití slovníku, než sdružování „různých“ typů informací, je takzvaná vyhledávací tabulka (angl. lookup table). V ní mají typicky všechny hodnoty stejný typ.
Taková tabulka se hodí vždycky, když je potřeba přiřadit nějaké hodnoty jiným hodnotám. Jako v telefonním seznamu, kde každému jménu přísluší nějaké číslo, nebo v překladovém slovníku, kde jsou slovům přiřazeny překlady.
cisla = {
'Maruška': '153 85283',
'Terka': '237 26505',
'Michal': '491 88047',
'Renata': '385 11223',
}
barvy = {
'hruška': 'zelená',
'jablko': 'červená',
'meloun': 'zelená',
'švestka': 'modrá',
'ředkvička': 'červená',
'zelí': 'zelená',
'mrkev': 'červená',
}
Když dáš slovník do cyklu for
, dostaneš klíče:
>>> popisy_funkci = {'len': 'délka', 'str': 'řetězec', 'dict': 'slovník'}
>>> for klic in popisy_funkci:
... print(klic)
str
dict
len
Pokud chceš hodnoty, stačí použít metodu values
:
>>> for hodnota in popisy_funkci.values():
... print(hodnota)
řetězec
slovník
délka
Většinou ale potřebuješ jak klíče tak hodnoty.
K tomu mají slovníky metodu items
,
která bude v cyklu for
dávat dvojice:
>>> for klic, hodnota in popisy_funkci.items():
... print('{}: {}'.format(klic, hodnota))
str: řetězec
dict: slovník
len: délka
Existuje i metoda keys()
, která vrací klíče.
To, co keys()
, values()
a items()
vrací, jsou speciální objekty,
které kromě použití ve for
umožňují další
operace: například pracovat s klíči jako s množinou.
V dokumentaci
Pythonu je to všechno popsáno.
V průběhu takového for
cyklu nesmíš
do slovníku přidávat záznamy, ani záznamy odebírat:
>>> for klic in popisy_funkci:
... del popisy_funkci[klic]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
Hodnoty u už existujících klíčů ale měnit můžeš.
Slovník se dá vytvořit dvěma způsoby.
První, pomocí {složených závorek}, jsme už viděly;
další využívají funkci dict
.
Ta, ve stylu str
, int
či list
, převede cokoli, co jde, na slovník.
Slovník je ovšem dost specifická struktura – čísla nebo typické seznamy na něj převádět nejdou. Můžeme ale na slovník převést jiný slovník. Nový slovník žije svým vlastním životem; můžeš ho měnit nezávisle na tom původním.
barvy_po_tydnu = dict(barvy)
for klic in barvy_po_tydnu:
barvy_po_tydnu[klic] = 'černo-hnědo-' + barvy_po_tydnu[klic]
print(barvy_po_tydnu['jablko'])
print(barvy['jablko']) # původní slovník se nezměnil
Druhá věc, která jde převést na slovník, je sekvence dvojic klíč/hodnota – ať už seznam:
data = [(1, 'jedna'), (2, 'dva'), (3, 'tři')]
nazvy_cisel = dict(data)
nebo jiný iterovatelný objekt:
data = enumerate(['jedna', 'dva' 'tři'])
nazvy_cisel = dict(data)
A to je vše, co se na slovník dá převést.
Jako bonus umí funkce dict
ještě
brát pojmenované argumenty.
Každé jméno argumentu převede na řetězec,
použije ho jako klíč, a přiřadí danou hodnotu:
popisy_funkci = dict(len='délka', str='řetězec', dict='slovník')
print(popisy_funkci['len'])
Pozor na to, že v tomhle případě musí být klíče
pythonní „jména“ – musí být použitelné jako jména proměnných.
Například takhle nejde zadat jako klíč řetězec
"def"
nebo "propan-butan"
.
Pojmenované argumenty jde kombinovat s ostatními
způsoby vytvoření dict
.
Chceš-li mít všechny triky, které slovníky umí, pěkně pohromadě, můžeš si stáhnout Slovníkový tahák.
Kompletní popis slovníků najdeš v dokumentaci Pythonu.