Jak a kdy byste měli použít Defaultdict v Pythonu?

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!

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?

  5 nejlepších nástrojů pro plánování kapacity sítě (recenze)

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().

  Kolik typů kláves na počítačové klávesnici

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.

  PSA: Dejte si pozor na tento nový podvod s doručováním balíčků textových zpráv

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.