Hvordan og hvornår skal du bruge Defaultdict i Python?

I denne tutorial lærer du, hvordan du bruger defaultdict fra Pythons samlingsmodul – for at håndtere KeyErrors bedre – når du arbejder med Python-ordbøger.

I Python er en ordbog en kraftfuld indbygget datastruktur, der gemmer data i nøgleværdi-par. Du skal bruge tasterne til at trykke ind i ordbogen og få adgang til værdierne.

Men når du har flere ordbøger i dit Python-script, der ændres under kørsel af kode, vil du ofte løbe ind i KeyErrors. Og der er et par forskellige måder, du kan håndtere dem på.

I denne tutorial lærer du:

  • Hvad KeyErrors er, og hvorfor de opstår
  • Sådan håndteres KeyErrors
  • Sådan bruger du Pythons defaultdict, en underklasse, der arver fra den indbyggede dict-klasse, til at håndtere manglende nøgler bedre

Lad os begynde!

Hvad er nøglefejl i Python?

Når du definerer en Python-ordbog, skal du sørge for følgende:

  • Nøglerne skal være unikke – uden gentagelser.
  • Når du bruger en eksisterende iterabel som nøglerne til en ordbog, bør du foretrække at bruge en uforanderlig samling såsom en tupel.

Så en nøgle er kun gyldig, hvis den findes i ordbogen; ellers fører det til KeyErrors.

Overvej følgende ordbog, books_authors, hvor nøglerne er navnene på bøgerne, og værdierne er navnene på forfatterne.

Du kan kode sammen med denne tutorial i en Python REPL.

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

Du kan bruge tasten (bogens navn) for at få adgang til forfatterens navn.

books_authors['Hyperfocus']
'Chris Bailey'

For at få adgang til alle nøgleværdi-parrene i ordbogen kan du kalde items()-metoden på ordbogsobjektet, som vist nedenfor:

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

Hvis du forsøger at få adgang til værdien af ​​en nøgle, der ikke er til stede i ordbogen, rejser Python-fortolkeren en KeyError. Vi støder på KeyError, når vi forsøger at få adgang til værdien af ​​nøgler, der ikke eksisterer, nemlig ‘Grit’ og ‘ikke-eksisterende nøgle’.

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'

Så hvordan håndterer du KeyErrors i Python?

  Hvor er WPS-knappen på Canon-printeren?

Der er få måder at gøre det på, og vi lærer dem i næste afsnit.

Sådan håndteres nøglefejl i Python

Lad os lære, hvordan du håndterer KeyErrors ved hjælp af:

  • Hvis ellers betingede udsagn
  • Prøv-undtagen blokke
  • Ordbogsmetoden .get()

#1. Brug af If-Else betingede erklæringer

En af de mest enkle måder at håndtere KeyErrors i Python på er at bruge if-else betingede sætninger.

I Python har if-else-sætninger følgende generelle syntaks:

 if condition:
 	# do this 
 else:
    # do something else 
  • Hvis betingelsen er Sand, udføres udsagn i if-legemet, og
  • Hvis betingelsen er falsk, udføres udsagn i else-kroppen.

I dette eksempel er betingelsen at kontrollere, om nøglen er til stede i ordbogen.

Hvis nøglen er til stede i ordbogen, vil in-operatoren returnere True, og hvis body vil blive udført, udskriver den tilsvarende værdi.

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

# Output
# Neil Pasricha

Hvis nøglen ikke er til stede i ordbogen, returnerer in-operatoren False, og den anden tekst vil blive udført. Den udskriver en besked om, at nøglen ikke er til stede.

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. Brug af Try-Except-erklæringer

En anden almindelig metode til at håndtere KeyError er at bruge try-except-sætningerne i Python.

Læs følgende kodeblok:

key = 'non-existent-key'
try:
  print(books_authors[key])
except KeyError:
  print('Sorry, this key does not exist!')
  • Prøv-blokken forsøger at hente den værdi, der svarer til den angivne nøgle.
  • Hvis nøglen ikke er til stede, rejser tolken en KeyError, som håndteres som en undtagelse inden for undtagelsesblokken.

#3. Brug af .get() metoden

I Python kan du bruge den indbyggede ordbogsmetode .get() til at håndtere manglende nøgler.

Den generelle syntaks for at bruge get()-metoden er dict.get(key,default_value), hvor dict er et gyldigt ordbogsobjekt i Python.

  Network Address Translation (NAT): En introduktion

– Hvis nøglen er til stede i ordbogen, returnerer metoden get() værdien.
– Ellers returnerer den standardværdien.

I dette eksempel er nøgler en liste over nøgler, hvis værdier vi gerne vil have adgang til. Vi går gennem nøglelisten for at hente de tilsvarende værdier fra books_authors-ordbogen.

Her har vi brugt .get() metoden med ‘Eksisterer ikke’ som standardværdi.

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

I ovenstående kode:

  • For nøgler, der findes i books_authors-ordbogen, returnerer .get()-metoden de tilsvarende værdier.
  • Når nøglerne ikke findes, i dette tilfælde ‘Grit’ og ‘Make Time’, returnerer .get()-metoden standardværdien ‘Dos not exist’.
# Output

Does not exist
Chris Bailey
Does not exist
Cal Newport

Alle ovenstående metoder hjælper os med at håndtere nøglefejl. De er dog ordrette og kræver, at vi eksplicit håndterer de manglende nøgler. Du kan forenkle denne proces ved at bruge en standardordbog i stedet for en almindelig ordbog.

Defaultdict i Python

Standarddiktet er en underklasse af ordbogsklassen (dict). Så det arver adfærden fra en Python-ordbog. Derudover håndterer den også manglende nøgler indbygget.

Standarddict er en containerdatatype, der er indbygget i Python-standardbiblioteket – inde i samlingsmodulet.

Så du skal importere det til dit arbejdsmiljø:

from collections import defaultdict

Her er den generelle syntaks til at bruge defaultdict:

defaultdict(default_factory)

Du kan angive en callable, såsom int, float eller list, som standard_factory-attributten. Hvis du ikke angiver en værdi for default_factory, er den som standard Ingen.

Når den nøgle, du leder efter, ikke er til stede, udløses metoden __missing__(), og den udleder standardværdien fra default_factory. Det returnerer derefter denne standardværdi.

Sammenfattende:

  • I Python returnerer et defaultdict standardværdien, når nøglen ikke er til stede.
  • Det tilføjer også dette nøgle-standardværdipar til ordbogen, som du derefter kan ændre.

Python Defaultdict eksempler

Dernæst vil vi kode et par eksempler for at forstå, hvordan Python defaultdict fungerer.

Defaultdict i Python med standardheltalsværdi

Importer først defaultdict fra samlingsmodulet.

from collections import defaultdict
import random

Lad os oprette et standarddiktpriser.

prices = defaultdict(int)

Vi udfylder nu prisordbogen ved at bruge emnerne på frugtlisten som nøglerne. Og vi prøver tilfældigt værdier fra prislisten for at få værdierne.

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

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

Lad os tage et kig på nøgleværdi-parrene i prisens defaultdict.

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

Som en almindelig Python-ordbog kan du få adgang til værdierne af standardpriserne ved hjælp af tasterne:

prices['apple']
# 23

Lad os nu prøve at få adgang til prisen på en frugt, der ikke er til stede, f.eks. ‘orange’. Vi ser, at det returnerer standardværdien nul.

prices['orange']
# 0

Hvis vi udskriver ordbogen, ser vi, at der er tilføjet en ny nøgle ‘orange’ med standard-heltalsværdien nul.

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

Defaultdict i Python med List som standardværdi

Lad os definere students_majors som en standarddict af lister. Navnene på majorerne er tangenterne. Og værdierne er lister over studerende, der forfølger hver af hovedfagene, såsom matematik, økonomi, datalogi og meget mere.

from collections import defaultdict
students_majors = defaultdict(list)

Hvis vi forsøger at få adgang til elevlisten svarende til ‘Economics’, returnerer defaultdict en tom liste; ingen nøglefejl!

students_majors['Economics']
# []

Vi har nu en tom liste knyttet til hovedfaget ‘Økonomi’. Så vi kan nu tilføje elementer til denne liste ved hjælp af listemetoden .append().

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

Der er oprettet en post for ‘Økonomi’ i standardordbogen for studerende.

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

Du kan tilføje flere studerende til listen over kortlægning til økonomifaget, tilføje et nyt hovedfag og meget mere!

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

Konklusion

Jeg håber, at denne tutorial hjalp dig med at forstå, hvordan og hvornår du skal bruge defaultdict i Python. Efter at have kørt kodeeksemplerne i denne vejledning, kan du prøve at bruge defaultdict som den foretrukne datastruktur i dine projekter, når det er nødvendigt.

  Hvad er GIFV, og hvad betyder det for dig

Her er en oversigt over, hvad du har lært i denne øvelse.

  • Når du arbejder med en Python-ordbog, støder du ofte på KeyErrors.
  • For at håndtere sådanne KeyErrors kan du bruge nogle få udførlige metoder. Du kan bruge betingede sætninger, try-except-blokke eller .get()-metoden. Men standarddict-datatypen i samlingsmodulet kan forenkle denne KeyError-håndtering.
  • Du kan bruge defaultdict(default_factory), hvor default_factory er en gyldig callable.
  • Når nøglen ikke er til stede i standarddiktet, føjes standardværdien (udledt af default_factory) og nøglen til standarddiktet.

Tjek derefter selvstudiet om Python-kortfunktionen.