V tomto tutoriálu se naučíte, jak používat defaultdict z modulu kolekce Pythonu – pro lepší zpracování KeyErrors – při práci se slovníky Pythonu.
V Pythonu je slovník výkonná vestavěná datová struktura, která ukládá data v párech klíč-hodnota. Pomocí kláves se dostanete do slovníku a získáte přístup k hodnotám.
Pokud však máte ve skriptu Python více slovníků, které se během provádění kódu upravují, často narazíte na chyby KeyErrors. A existuje několik různých způsobů, jak s nimi zacházet.
V tomto tutoriálu se naučíte:
- Co jsou klíčové chyby a proč vznikají
- Jak zacházet s chybami KeyErrors
- Jak používat Pythonův defaultdict, podtřídu, která dědí z vestavěné třídy dict, k lepšímu zpracování chybějících klíčů
Pojďme začít!
Table of Contents
Co jsou klíčové chyby v Pythonu?
Při definování slovníku Pythonu byste měli dbát na to, abyste zajistili následující:
- Klíče by měly být jedinečné – bez jakéhokoli opakování.
- Při použití existující iterovatelné jako klíče slovníku byste měli upřednostňovat použití neměnné kolekce, jako je n-tice.
Klíč je tedy platný pouze tehdy, je-li přítomen ve slovníku; jinak to vede ke KeyErrors.
Zvažte následující slovník books_authors, ve kterém jsou klíče názvy knih a hodnoty jsou jména autorů.
Spolu s tímto návodem můžete kódovat v Python REPL.
books_authors = { 'Deep Work':'Cal Newport', 'Hyperfocus':'Chris Bailey', 'Pivot':'Jenny Blake', 'The Happiness Equation':'Neil Pasricha' }
Pro přístup ke jménu autora můžete použít klíč (název knihy).
books_authors['Hyperfocus'] 'Chris Bailey'
Chcete-li získat přístup ke všem párům klíč–hodnota ve slovníku, můžete zavolat metodu items() na objekt slovníku, jak je znázorněno níže:
for book,author in books_authors.items(): print(f"'{book}' by {author}")
'Deep Work' by Cal Newport 'Hyperfocus' by Chris Bailey 'Pivot' by Jenny Blake 'The Happiness Equation' by Neil Pasricha
Pokud se pokusíte získat přístup k hodnotě klíče, který není přítomen ve slovníku, interpret Pythonu vyvolá KeyError. Na KeyError narazíme, když se pokoušíme získat přístup k hodnotě klíčů, které neexistují, jmenovitě ‚Grit‘ a ‚neexistující klíč‘.
books_authors['Grit']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-6-e1a4486f5ced> in <module> ----> 1 books_authors['Grit'] KeyError: 'Grit'
books_authors['non-existent-key']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-7-a3efd56f69e5> in <module> ----> 1 books_authors['non-existent-key'] KeyError: 'non-existent-key'
Jak tedy řešíte chyby KeyErrors v Pythonu?
Existuje několik způsobů, jak to udělat, a my se je naučíme v další části.
Jak zacházet s KeyErrors v Pythonu
Pojďme se naučit, jak zacházet s chybami KeyErrors pomocí:
- Podmíněné příkazy if-else
- Zkuste-kromě bloků
- Slovníková metoda .get()
#1. Použití podmíněných příkazů If-Else
Jedním z nejjednodušších způsobů zpracování KeyErrors v Pythonu je použití podmíněných příkazů if-else.
V Pythonu mají příkazy if-else následující obecnou syntaxi:
if condition: # do this else: # do something else
- Pokud je podmínka True, provedou se příkazy v těle if a
- Pokud je podmínka False, provedou se příkazy v těle else.
V tomto příkladu je podmínkou zkontrolovat, zda je klíč přítomen ve slovníku.
Pokud je klíč ve slovníku přítomen, operátor in vrátí True a pokud se provede tělo, vypíše se odpovídající hodnota.
key = 'The Happiness Equation' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Neil Pasricha
Pokud klíč není ve slovníku přítomen, operátor in vrátí hodnotu False a tělo else bude provedeno. Vypíše zprávu, že klíč není přítomen.
key = 'non-existent-key' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Sorry, this key does not exist!
#2. Použití příkazů Try-Except
Další běžnou metodou pro zpracování KeyError je použití příkazů try-except v Pythonu.
Přečtěte si následující blok kódu:
key = 'non-existent-key' try: print(books_authors[key]) except KeyError: print('Sorry, this key does not exist!')
- Blok try se pokusí získat hodnotu odpovídající zadanému klíči.
- Pokud klíč není přítomen, interpret vyvolá chybu KeyError, která je zpracována jako výjimka v bloku výjimkou.
#3. Pomocí metody .get().
V Pythonu můžete ke zpracování chybějících klíčů použít vestavěnou slovníkovou metodu .get().
Obecná syntaxe pro použití metody get() je dict.get(key,default_value), kde dict je platný objekt slovníku v Pythonu.
– Pokud je klíč ve slovníku, metoda get() vrátí hodnotu.
– V opačném případě vrátí výchozí hodnotu.
V tomto příkladu jsou klíče seznam klíčů, k jejichž hodnotám bychom chtěli přistupovat. Procházíme seznam klíčů, abychom získali odpovídající hodnoty ze slovníku books_authors.
Zde jsme použili metodu .get() s výchozí hodnotou ‚Neexistuje‘.
keys = ['Grit','Hyperfocus','Make Time','Deep Work'] for key in keys: print(books_authors.get(key,'Does not exist'))
Ve výše uvedeném kódu:
- Pro klíče, které se nacházejí ve slovníku books_authors, vrací metoda .get() odpovídající hodnoty.
- Když klíče neexistují, v tomto případě ‚Grit‘ a ‚Make Time‘, metoda .get() vrátí výchozí hodnotu ‚Neexistuje‘.
# Output Does not exist Chris Bailey Does not exist Cal Newport
Všechny výše uvedené metody nám pomáhají při řešení klíčových chyb. Jsou však podrobné a vyžadují, abychom výslovně zpracovali chybějící klíče. Tento proces můžete zjednodušit tím, že místo běžného slovníku použijete defaultdict.
Defaultdict v Pythonu
Defaultdict je podtřídou třídy dictionary (dict). Přebírá tedy chování pythonského slovníku. Navíc si nativně poradí i s chybějícími klávesami.
Defaultdict je datový typ kontejneru, který je zabudován do standardní knihovny Pythonu – uvnitř modulu kolekcí.
Musíte jej tedy importovat do svého pracovního prostředí:
from collections import defaultdict
Zde je obecná syntaxe pro použití defaultdict:
defaultdict(default_factory)
Jako atribut default_factory můžete zadat callable, jako je int, float nebo list. Pokud nezadáte hodnotu pro default_factory, výchozí je None.
Když klíč, který hledáte, není přítomen, spustí se metoda __missing__() a ta odvodí výchozí hodnotu z default_factory. Poté vrátí tuto výchozí hodnotu.
Celkem:
- V Pythonu vrací defaultdict výchozí hodnotu, když klíč není přítomen.
- Také přidá tento pár klíč-výchozí hodnota do slovníku, který pak můžete upravit.
Příklady Python Defaultdict
Dále si nakódujeme několik příkladů, abychom pochopili, jak Python defaultdict funguje.
Defaultdict v Pythonu s výchozí celočíselnou hodnotou
Nejprve importujte defaultdict z modulu kolekcí.
from collections import defaultdict import random
Vytvořme výchozí ceny.
prices = defaultdict(int)
Nyní naplníme slovník cen pomocí položek seznamu ovoce jako klíčů. A náhodně vybíráme hodnoty z ceníku, abychom získali hodnoty.
price_list = [10,23,12,19,5] fruits = ['apple','strawberry','pomegranate','blueberry'] for fruit in fruits: prices[fruit] = random.choice(price_list)
Podívejme se na páry klíč–hodnota ve výchozím nastavení cen.
print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10)])
Stejně jako běžný slovník Pythonu můžete přistupovat k hodnotám defaultdict cen pomocí kláves:
prices['apple'] # 23
Nyní se pokusme získat přístup k ceně ovoce, které není přítomno, řekněme, „pomeranč“. Vidíme, že vrací výchozí hodnotu nula.
prices['orange'] # 0
Pokud vytiskneme slovník, uvidíme, že byl přidán nový klíč ‚oranžový‘ s výchozí celočíselnou hodnotou nula.
print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10), ('orange', 0)])
Defaultdict v Pythonu se seznamem jako výchozí hodnotou
Definujme students_majors jako výchozí diktát seznamů. Jména majorů jsou klíčem. A hodnotami jsou seznamy studentů, kteří studují jednotlivé obory, jako je matematika, ekonomie, informatika a další.
from collections import defaultdict students_majors = defaultdict(list)
Pokud se pokusíme otevřít seznam studentů odpovídající ‚Ekonomie‘, defaultdict vrátí prázdný seznam; žádné klíčové chyby!
students_majors['Economics'] # []
Nyní máme prázdný seznam namapovaný na obor ‚Ekonomika‘. Nyní tedy můžeme přidat prvky do tohoto seznamu pomocí metody seznamu .append().
students_majors['Economics'].append('Alex')
Ve výchozím slovníku students_majors byl vytvořen záznam pro ‚Ekonomika‘.
print(students_majors)
defaultdict(<class 'list'>, {'Economics': ['Alex']})
Můžete přidat další studenty do seznamu mapujícího obor ekonomie, přidat nový obor a mnoho dalšího!
students_majors['Economics'].append('Bob') students_majors['Math'].append('Laura') print(students_majors)
defaultdict(<class 'list'>, {'Economics': ['Alex', 'Bob'], 'Math': ['Laura']})
Závěr
Doufám, že vám tento tutoriál pomohl pochopit, jak a kdy byste měli použít defaultdict v Pythonu. Po spuštění příkladů kódu v tomto kurzu můžete v případě potřeby zkusit použít defaultdict jako preferovanou datovou strukturu ve svých projektech.
Zde je shrnutí toho, co jste se v tomto tutoriálu naučili.
- Při práci se slovníkem Pythonu se často setkáte s chybami KeyErrors.
- Ke zpracování takových KeyErrors můžete použít několik podrobných metod. Můžete použít podmíněné příkazy, bloky try-except nebo metodu .get(). Ale datový typ defaultdict v modulu kolekcí může toto zpracování KeyError zjednodušit.
- Můžete použít defaultdict(default_factory), kde default_factory je platný callable.
- Pokud klíč není v defaultdict přítomen, výchozí hodnota (odvozená z default_factory) a klíč jsou přidány do defaultdict.
Dále se podívejte na tutoriál o funkci mapy Python.