Hogyan és mikor kell használni a Defaultdict-ot a Pythonban?

Ebből az oktatóanyagból megtudhatja, hogyan használhatja a Python gyűjteménymoduljából származó defaultdict-et a KeyError-ok jobb kezelése érdekében, amikor Python szótárakat használ.

A Pythonban a szótár egy hatékony beépített adatstruktúra, amely kulcs-érték párokban tárolja az adatokat. A billentyűk segítségével elérheti a szótárt, és elérheti az értékeket.

Ha azonban több olyan szótár van a Python-szkriptben, amelyek a kódvégrehajtás során módosulnak, gyakran futnak KeyErrors-ok. És van néhány különböző módon kezelheti őket.

Ebből az oktatóanyagból megtudhatja:

  • Mik azok a kulcshibák, és miért keletkeznek
  • A kulcshibák kezelése
  • Hogyan használhatjuk a Python alapértelmezett diktátumát, egy alosztályt, amely a beépített dict osztályból öröklődik a hiányzó kulcsok jobb kezelésére

Kezdjük!

Mik azok a kulcshibák a Pythonban?

Python szótár meghatározásakor ügyeljen a következőkre:

  • A kulcsoknak egyedinek kell lenniük – minden ismétlés nélkül.
  • Ha egy meglévő iterálható szótár kulcsaként használ, akkor előnyben kell részesítenie egy megváltoztathatatlan gyűjtemény, például egy sor használatát.

Tehát egy kulcs csak akkor érvényes, ha benne van a szótárban; egyébként KeyErrors-hoz vezet.

Tekintsük a következő, books_authors szótárat, amelyben a kulcsok a könyvek nevei, az értékek pedig a szerzők nevei.

Ezzel az oktatóanyaggal együtt kódolhat egy Python REPL-ben.

books_authors = {
    'Deep Work':'Cal Newport',
    'Hyperfocus':'Chris Bailey',
    'Pivot':'Jenny Blake',
    'The Happiness Equation':'Neil Pasricha'
}

A kulccsal (a könyv neve) érheti el a szerző nevét.

books_authors['Hyperfocus']
'Chris Bailey'

A szótár összes kulcs-érték párjának eléréséhez hívja meg az items() metódust a szótárobjektumban, az alábbiak szerint:

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

Ha olyan kulcs értékéhez próbál hozzáférni, amely nem szerepel a szótárban, a Python értelmező KeyError-t vet fel. A KeyError hibaüzenetbe ütközünk, amikor nem létező kulcsok értékéhez próbálunk hozzáférni, nevezetesen a „Grit” és a „non-existent key” kulcsokhoz.

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'

Tehát hogyan kezeli a KeyError-okat a Pythonban?

  Generáljon egyedi vállalkozásnevet ezzel a 10 eszközzel

Ennek néhány módja van, ezeket a következő részben tanuljuk meg.

Hogyan kezeljük a kulcshibákat a Pythonban

Tanuljuk meg, hogyan kell kezelni a kulcshibákat a következő használatával:

  • If-else feltételes állítások
  • Próbáld ki a blokkokat
  • A szótár metódusa .get()

#1. If-Else feltételes kijelentések használata

A Python kulcshibáinak kezelésének egyik legegyszerűbb módja az if-else feltételes utasítások használata.

A Pythonban az if-else utasítások általános szintaxisa a következő:

 if condition:
 	# do this 
 else:
    # do something else 
  • Ha a feltétel igaz, akkor az if törzsben lévő utasítások végrehajtásra kerülnek, és
  • Ha a feltétel False, akkor az else törzsben lévő utasítások végrehajtásra kerülnek.

Ebben a példában a feltétel annak ellenőrzése, hogy a kulcs szerepel-e a szótárban.

Ha a kulcs benne van a szótárban, az in operátor True-t ad vissza, és ha a body végrehajtásra kerül, akkor a megfelelő értéket nyomtatja ki.

key = 'The Happiness Equation'
if key in books_authors:
  print(books_authors[key])
else:
  print('Sorry, this key does not exist!')

# Output
# Neil Pasricha

Ha a kulcs nem szerepel a szótárban, az in operátor False értéket ad vissza, és az else törzs végrehajtásra kerül. Kiír egy üzenetet, hogy a kulcs nincs meg.

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. Try-Except utasítások használata

Egy másik gyakori módszer a KeyError kezelésére a Pythonban a try-except utasítások használata.

Olvassa el a következő kódblokkot:

key = 'non-existent-key'
try:
  print(books_authors[key])
except KeyError:
  print('Sorry, this key does not exist!')
  • A try blokk megpróbálja lekérni a megadott kulcsnak megfelelő értéket.
  • Ha a kulcs nincs jelen, az értelmező KeyError-t vet fel, amelyet kivételként kezel a kivétel blokkon belül.

#3. A .get() metódus használata

A Pythonban a beépített .get() szótármódszert használhatja a hiányzó kulcsok kezelésére.

  Blokkolja a „Mailto:” hivatkozásokat, és másolja az e-mail címet a vágólapra [Chrome]

A get() metódus általános szintaxisa a dict.get(key,default_value), ahol a dict egy érvényes szótárobjektum a Pythonban.

– Ha a kulcs szerepel a szótárban, akkor a get() metódus visszaadja az értéket.
– Ellenkező esetben az alapértelmezett értéket adja vissza.

Ebben a példában a kulcsok azon kulcsok listája, amelyek értékeit szeretnénk elérni. Végigpörgetjük a kulcslistát, hogy lekérjük a megfelelő értékeket a books_authors szótárból.

Itt a .get() metódust használtuk, a „Nem létezik” alapértelmezett értékkel.

keys = ['Grit','Hyperfocus','Make Time','Deep Work']
for key in keys:
  print(books_authors.get(key,'Does not exist'))

A fenti kódban:

  • A books_authors szótárban található kulcsok esetében a .get() metódus a megfelelő értékeket adja vissza.
  • Ha a kulcsok nem léteznek, ebben az esetben a „Grit” és a „Make Time”, a .get() metódus a „Nem létezik” alapértelmezett értéket adja vissza.
# Output

Does not exist
Chris Bailey
Does not exist
Cal Newport

A fenti módszerek mindegyike segít a kulcshibák kezelésében. Ezek azonban bőbeszédűek, és megkövetelik, hogy kifejezetten kezeljük a hiányzó kulcsokat. Ezt a folyamatot leegyszerűsítheti egy alapértelmezett szótár használatával.

Alapértelmezett parancs a Pythonban

A defaultdict a szótár (dict) osztály egyik alosztálya. Tehát örökli a Python szótár viselkedését. Ezen kívül a hiányzó kulcsokat is natívan kezeli.

Az alapértelmezett diktátum egy tároló adattípus, amely a Python szabványos könyvtárába van beépítve – a gyűjtemények modulon belül.

Tehát importálnia kell a munkakörnyezetébe:

from collections import defaultdict

Íme a defaultdict használatának általános szintaxisa:

defaultdict(default_factory)

A default_factory attribútumként megadhat egy hívhatót, például int, float vagy listát. Ha nem ad meg értéket a default_factory paraméterhez, akkor alapértelmezés szerint None lesz.

Ha a keresett kulcs nincs jelen, a __missing__() metódus aktiválódik, és az alapértelmezett értéket a default_factoryból következteti ki. Ezután ezt az alapértelmezett értéket adja vissza.

Összefoglalva:

  • A Pythonban a defaultdict az alapértelmezett értéket adja vissza, ha a kulcs nincs jelen.
  • Ezt a kulcs-alapértelmezett értékpárt is hozzáadja a szótárhoz, amelyet ezután módosíthat.

Python Defaultdict példák

Ezután néhány példát kódolunk, hogy megértsük, hogyan működik a Python defaultdict.

Defaultdict Pythonban alapértelmezett egész értékkel

Először importálja a defaultdict-ot a gyűjtemények modulból.

from collections import defaultdict
import random

Hozzon létre egy alapértelmezett árakat.

prices = defaultdict(int)

Most feltöltjük az árszótárat a gyümölcslista elemeivel kulcsként. És véletlenszerűen mintázunk értékeket az árlistából, hogy megkapjuk az értékeket.

price_list = [10,23,12,19,5]
fruits = ['apple','strawberry','pomegranate','blueberry']

for fruit in fruits:
  prices[fruit] = random.choice(price_list)

Vessünk egy pillantást a kulcs-érték párokra az alapértelmezett árakban.

print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10)])

A szokásos Python-szótárhoz hasonlóan a billentyűk használatával érheti el az árak alapértelmezett értékeit:

prices['apple']
# 23

Most próbáljuk meg elérni egy olyan gyümölcs árát, amely nincs jelen, mondjuk „narancs”. Látjuk, hogy az alapértelmezett nulla értéket adja vissza.

prices['orange']
# 0

Ha kinyomtatjuk a szótárt, azt látjuk, hogy egy új narancssárga kulcs került hozzáadásra az alapértelmezett nulla egész számmal.

print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10), ('orange', 0)])

Defaultdict a Pythonban listával az alapértelmezett érték

Határozzuk meg a students_majors-t a listák alapértelmezett parancsaként. A szakok nevei a kulcsok. Az értékek pedig az egyes szakokon – például matematika, közgazdaságtan, informatika stb. – folytató hallgatók listái.

from collections import defaultdict
students_majors = defaultdict(list)

Ha megpróbáljuk elérni a „Közgazdaságtan”-nak megfelelő hallgatói listát, a defaultdict üres listát ad vissza; nincs kulcshiba!

students_majors['Economics']
# []

Most van egy üres listánk a „Közgazdaságtan” szakhoz. Így a listához az .append() metódussal tudunk elemeket hozzáadni.

students_majors['Economics'].append('Alex')

Létrejött a „Közgazdaságtan” szócikk a students_majors alapértelmezett szótárában.

print(students_majors)
defaultdict(<class 'list'>, {'Economics': ['Alex']})

További hallgatókat is felvehet a közgazdasági szakra vonatkozó listához, új szakot adhat hozzá, és még sok más!

students_majors['Economics'].append('Bob')
students_majors['Math'].append('Laura')
print(students_majors)
defaultdict(<class 'list'>, {'Economics': ['Alex', 'Bob'], 'Math': ['Laura']})

Következtetés

Remélem, ez az oktatóanyag segített megérteni, hogyan és mikor kell használni a defaultdict-ot a Pythonban. Az ebben az oktatóanyagban található kódpéldák futtatása után szükség esetén megpróbálhatja a defaultdict használatát preferált adatstruktúraként a projektekben.

  Használja a Hubitatot Smarthome automatizálására?

Itt található az oktatóanyagban tanultak összefoglalása.

  • Amikor Python szótárral dolgozik, gyakran ütközik KeyErrors-ba.
  • Az ilyen kulcshibák kezeléséhez használhat néhány részletes módszert. Használhat feltételes utasításokat, try-except blokkokat vagy a .get() metódust. De az alapértelmezett adattípus a gyűjtemények modulban leegyszerűsítheti ezt a KeyError kezelést.
  • Használhatja a defaultdict(default_factory) értéket, ahol a default_factory egy érvényes hívható.
  • Ha a kulcs nem szerepel a defaultdictben, az alapértelmezett érték (a default_factory-ból következtetve) és a kulcs hozzáadódik a defaultdicthez.

Ezután nézze meg a Python térképfunkcióról szóló oktatóanyagot.