Jak efektivně pracovat se slovníky v Pythonu
Chcete se naučit, jak plně využít potenciál slovníků v Pythonu? Tento průvodce vám ukáže, jak pomocí metod slovníku provádět čtení, úpravy a další běžné úkony. Probereme si základy a následně si vytvoříme ukázkový slovník, který budeme modifikovat s pomocí různých metod.
Pojďme na to…
Základní informace o slovnících v Pythonu
Slovníky jsou klíčové datové struktury v Pythonu, které slouží k ukládání dat ve formě párů klíč-hodnota. Umožňují definovat vazby mezi klíči a jejich odpovídajícími hodnotami.
Klíče ve slovníku musí být unikátní a hashovatelné. Pro vyhledání hodnoty lze použít klíč nebo využít zabudované metody, které si brzy ukážeme.
Slovník v Pythonu můžete vytvořit inicializací s páry klíč-hodnota nebo začít s prázdným slovníkem a páry postupně přidávat.
>>> slovnik1 = {'jazyk':'Python','libi_se':True} >>> type(slovnik1) <class 'dict'> # Alternativní způsob: >>> slovnik1 = {} >>> slovnik1['jazyk']='Python' >>> slovnik1['libi_se']=True
Metody slovníku pro běžné operace
Ujistěte se, že máte nainstalovaný Python verze 3.7 nebo novější, abyste mohli kódovat spolu s příklady. Můžete použít Python REPL nebo online editor.
>>> osoba = {'jmeno':'Alice', ... 'mesto':'Praha', ... 'zajem':'Programovani', ... 'profese':'Vyvojar' ... }
Nyní, když máme inicializovaný slovník, můžeme se podívat na různé metody, které s ním můžeme používat.
Získání klíčů slovníku pomocí metody `keys()`
Častým úkolem při práci se slovníky je potřeba získat seznam všech klíčů, hodnot nebo párů klíč-hodnota. Pro získání klíčů slovníku použijeme metodu `keys()`:
>>> osoba.keys() dict_keys(['jmeno', 'mesto', 'zajem', 'profese'])
Získání hodnot slovníku pomocí metody `values()`
Metoda `values()` vrací všechny hodnoty uložené ve slovníku a je užitečná, pokud s těmito hodnotami potřebujete dále pracovat.
Získejme všechny hodnoty ze slovníku `osoba`:
>>> osoba.values() dict_values(['Alice', 'Praha', 'Programovani', 'Vyvojar'])
Získání párů klíč-hodnota pomocí metody `items()`
Metoda `items()` vrací seznam párů klíč-hodnota. Voláním této metody na slovníku `osoba` získáme seznam n-tic klíč-hodnota:
>>> osoba.items() dict_items([('jmeno', 'Alice'), ('mesto', 'Praha'), ('zajem', 'Programovani'), ('profese', 'Vyvojar')])
Získání mělké kopie pomocí metody `copy()`
Metoda `copy()` vytvoří mělkou kopii slovníku.
>>> osoba_kopie = osoba.copy()
Proměnná `osoba_kopie` nyní obsahuje mělkou kopii slovníku `osoba`. Upravme tuto kopii tak, že změníme hodnotu klíče ‚jmeno‘ na ‚Bob‘.
>>> osoba_kopie['jmeno'] = 'Bob' >>> osoba_kopie
Když se podíváme na obsah slovníku `osoba_kopie`, vidíme, že hodnota pro klíč ‚jmeno‘ byla změněna na ‚Bob‘.
{ 'jmeno': 'Bob', 'mesto': 'Praha', 'zajem': 'Programovani', 'profese': 'Vyvojar' }
Původní slovník `osoba` však zůstal nezměněn.
>>> osoba
{ 'jmeno': 'Alice', 'mesto': 'Praha', 'zajem': 'Programovani', 'profese': 'Vyvojar' }
Nastavení výchozích hodnot pomocí metody `setdefault()`
Při práci se slovníky se často setkáváme s výjimkou `KeyError`, pokud klíč ve slovníku neexistuje. Zkusme například získat přístup k neexistujícímu klíči ‚vek‘:
>>> osoba['vek'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'vek'
Těmto chybám se můžeme vyhnout použitím metod `setdefault()` a `get()` namísto přímého přístupu k hodnotě.
Metoda `setdefault(key)` vrací `slovnik[‚key‘]`, pokud klíč ve slovníku existuje.
>>> osoba.setdefault('jmeno') 'Alice'
Pokud klíč neexistuje, přidá ho do slovníku s výchozí hodnotou `None`.
>>> osoba.setdefault('adresa') >>> osoba
Klíč ‚adresa‘ ve slovníku `osoba` původně nebyl. Nyní je vidět, že byl přidán s výchozí hodnotou `None`.
{ 'jmeno': 'Alice', 'mesto': 'Praha', 'zajem': 'Programovani', 'profese': 'Vyvojar', 'adresa': None }
Nyní můžeme klíči ‚adresa‘ přiřadit nějakou hodnotu:
>>> osoba['adresa'] = "Ulice 123"
>>> osoba
{ 'jmeno': 'Alice', 'mesto': 'Praha', 'zajem': 'Programovani', 'profese': 'Vyvojar', 'adresa': 'Ulice 123' }
Můžeme také zadat výchozí hodnotu při volání metody:
>>> osoba.setdefault('zeme','CR') 'CR' >>> osoba
Protože klíč ‚zeme‘ ve slovníku `osoba` původně nebyl, byl přidán s hodnotou ‚CR‘.
{ 'jmeno': 'Alice', 'mesto': 'Praha', 'zajem': 'Programovani', 'profese': 'Vyvojar', 'adresa': 'Ulice 123', 'zeme': 'CR' }
Získání konkrétní hodnoty pomocí metody `get()`
Metoda `get()` vrací hodnotu odpovídající danému klíči. Volitelně můžeme zadat i výchozí hodnotu, která se vrátí, pokud klíč ve slovníku není nalezen.
Pokud se pokusíme získat hodnotu klíče ‚jmeno‘, dostaneme ‚Alice‘, protože klíč ve slovníku existuje:
>>> osoba.get('jmeno') 'Alice'
Slovník `osoba` nemá klíč ‚prumer‘. Pokud se pokusíme získat jeho hodnotu, v Python REPL nic nedostaneme, ale pokud ji vytiskneme, obdržíme `None`.
>>> osoba.get('prumer') >>> print(osoba.get('prumer')) None
Pokud však zadáme volitelnou výchozí hodnotu, získáme tuto hodnotu namísto `None`.
>>> osoba.get('prumer','nenalezeno') 'nenalezeno'
Metoda `get()` však klíč ‚prumer‘ do slovníku nepřidává.
>>> osoba
{ 'jmeno': 'Alice', 'mesto': 'Praha', 'zajem': 'Programovani', 'profese': 'Vyvojar', 'adresa': 'Ulice 123', 'zeme': 'CR' }
Rozdíl mezi metodami `setdefault()` a `get()`
Ačkoli obě metody, `setdefault()` i `get()`, lze použít ke zpracování výjimek `KeyError`, shrňme si, v čem se liší:
- `slovnik.setdefault(key, hodnota)` přidá klíč s hodnotou `hodnota` jako výchozí hodnotu. Pokud `hodnota` není zadána, klíč bude přidán s výchozí hodnotou `None`.
- `slovnik.get(key, hodnota)` vrátí hodnotu odpovídající klíči ze slovníku. Pokud klíč neexistuje, vrátí se `hodnota` (pokud je zadána) nebo `None`, ale klíč se do slovníku nepřidá.
Pro lepší zpracování chyb `KeyError` můžete v Pythonu také použít `defaultdict`.
Aktualizace obsahu slovníku pomocí metody `update()`
Existující slovník můžete aktualizovat pomocí párů klíč-hodnota z jiného slovníku. K aktualizaci obsahu můžeme použít metodu `update()` i s libovolným iterovatelným objektem.
Definujme si slovník `vice_informaci`. Poté aktualizujeme slovník `osoba` s obsahem ze slovníku `vice_informaci`:
>>> vice_informaci = {'hobby':'zpev', 'oblibene':'sladkosti'} >>> osoba.update(vice_informaci)
Z výstupu níže vidíme, že do slovníku `osoba` byly přidány klíče ‚hobby‘ a ‚oblibene‘.
>>> osoba
{ 'jmeno': 'Alice', 'mesto': 'Praha', 'zajem': 'Programovani', 'profese': 'Vyvojar', 'adresa': 'Ulice 123', 'zeme': 'CR', 'hobby': 'zpev', 'oblibene': 'sladkosti' }
Odstranění poslední přidané položky pomocí metody `popitem()`
Pro odstranění naposledy přidaného páru klíč-hodnota použijeme metodu `popitem()`.
>>> osoba.popitem() ('oblibene', 'sladkosti')
Voláním metody `popitem()` na slovníku `osoba` se vrátí pár klíč-hodnota (‚oblibene‘, ‚sladkosti‘), což byla poslední přidaná položka. Zároveň se tato položka ze slovníku odstraní.
Můžeme to ověřit kontrolou obsahu slovníku:
>>> osoba
{ 'jmeno': 'Alice', 'mesto': 'Praha', 'zajem': 'Programovani', 'profese': 'Vyvojar', 'adresa': 'Ulice 123', 'zeme': 'CR', 'hobby': 'zpev' }
Odstranění položky slovníku pomocí metody `pop()`
Metoda `popitem()` odstraňuje a vrací poslední pár klíč-hodnota. Pokud však potřebujeme odstranit i jiné položky, použijeme metodu `pop(key)`. Vrátí hodnotu odpovídající klíči a zároveň odstraní pár klíč-hodnota ze slovníku.
Příklad:
>>> osoba.pop('hobby') 'zpev'
Položka odpovídající klíči ‚hobby‘ byla odstraněna a ve slovníku se již nenachází.
>>> osoba
{ 'jmeno': 'Alice', 'mesto': 'Praha', 'zajem': 'Programovani', 'profese': 'Vyvojar', 'adresa': 'Ulice 123', 'zeme': 'CR' }
Pokud zadáme klíč, který neexistuje, obdržíme výjimku `KeyError`:
>>> osoba.pop('vek') Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'vek'
Výjimka `KeyError` nastala, protože klíč ‚vek‘ se ve slovníku `osoba` nenachází.
Na rozdíl od metody `pop()` u seznamů, která ve výchozím nastavení odstraňuje poslední položku, metoda `pop()` u slovníku vyžaduje zadání klíče. Pokud klíč neposkytneme, obdržíme chybu.
>>> osoba.pop() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: pop expected at least 1 argument, got 0
Odstranění všech položek slovníku pomocí metody `clear()`
Metody `pop()` a `popitem()` odstraňují vždy jen jeden pár klíč-hodnota. Pokud potřebujeme odstranit všechny položky ze slovníku, použijeme metodu `clear()`.
>>> osoba.clear() >>> osoba {}
Voláním metody `clear()` na slovníku `osoba` se odstraní všechny páry klíč-hodnota a slovník je nyní prázdný.
Shrnutí metod slovníku v Pythonu
Zde je rychlý přehled metod slovníku, které jsme se naučili:
Metoda | Syntaxe | Popis |
keys() | slovnik1.keys() | Vrací klíče slovníku `slovnik1` |
values() | slovnik1.values() | Vrací hodnoty slovníku `slovnik1` |
items() | slovnik1.items() | Vrací seznam všech párů klíč-hodnota v `slovnik1` |
copy() | slovnik1.copy() | Vytvoří mělkou kopii slovníku `slovnik1` |
setdefault() | slovnik1.setdefault(key, default_value) | – Přidá klíč s volitelnou hodnotou `default_value` (výchozí hodnota je `None`), pokud klíč neexistuje – Vrací `slovnik1[key]`, pokud klíč existuje |
get() | slovnik1.get(key, default_value) | – Vrací `slovnik1[key]`, pokud klíč existuje; jinak vrátí `default_value` – Pokud klíč neexistuje a není zadána `default_value`, vrátí `None` |
update() | slovnik1.update(iterable1) | Aktualizuje `slovnik1` pomocí párů klíč-hodnota z `iterable1` |
popitem() | slovnik1.popitem() | Odstraní a vrátí poslední pár klíč-hodnota z `slovnik1` |
pop() | slovnik1.pop(key) | – Odstraní a vrátí hodnotu odpovídající klíči `slovnik1[key]` – Vyvolá `KeyError`, pokud klíč neexistuje |
clear() | slovnik1.clear() | Odstraní všechny položky ze slovníku `slovnik1` |
Závěr
V tomto článku jsme si ukázali, jak používat běžné metody pro čtení, aktualizaci a mazání dat ve slovnících Pythonu. Také jsme si vysvětlili, jak metody `get()` a `setdefault()` pomáhají pracovat s výjimkami `KeyError`. Slovníky můžeme dále třídit dle klíče nebo hodnoty.
Podívejte se také na užitečné metody pro práci se seznamy v Pythonu. Přejeme vám příjemné kódování!