Hvordan og når bør du bruke Defaultdict i Python?

I denne opplæringen lærer du hvordan du bruker defaultdict fra Pythons samlingsmodul – for å håndtere KeyErrors bedre – når du arbeider med Python-ordbøker.

I Python er en ordbok en kraftig innebygd datastruktur som lagrer data i nøkkelverdi-par. Du bruker tastene til å trykke inn i ordboken og få tilgang til verdiene.

Men når du har flere ordbøker i Python-skriptet ditt som endres under kjøring av kode, vil du ofte støte på KeyErrors. Og det er noen forskjellige måter du kan håndtere dem på.

I denne opplæringen lærer du:

  • Hva KeyErrors er og hvorfor de oppstår
  • Hvordan håndtere KeyErrors
  • Hvordan bruke Pythons defaultdict, en underklasse som arver fra den innebygde dict-klassen, for å håndtere manglende nøkler bedre

La oss begynne!

Hva er nøkkelfeil i Python?

Når du definerer en Python-ordbok, bør du passe på at du bør sørge for følgende:

  • Nøklene skal være unike – uten repetisjoner.
  • Når du bruker en eksisterende iterabel som nøklene til en ordbok, bør du foretrekke å bruke en uforanderlig samling som en tuppel.

Så en nøkkel er bare gyldig hvis den finnes i ordboken; ellers fører det til KeyErrors.

Tenk på følgende ordbok, books_authors, der nøklene er navnene på bøkene og verdiene er navnene på forfatterne.

Du kan kode sammen med denne opplæringen i en Python REPL.

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

Du kan bruke tasten (navnet på boken) for å få tilgang til forfatterens navn.

books_authors['Hyperfocus']
'Chris Bailey'

For å få tilgang til alle nøkkelverdi-parene i ordboken, kan du kalle items()-metoden på ordbokobjektet, 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 prøver å få tilgang til verdien til en nøkkel som ikke er til stede i ordboken, vil Python-tolken oppstå en KeyError. Vi støter på KeyError når vi prøver å få tilgang til verdien av nøkler som ikke eksisterer, nemlig «Grit» og «ikke-eksisterende nøkkel».

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?

  21 nyhetsbrevideer for å overraske leserne dine

Det er få måter å gjøre det på, og vi lærer dem i neste avsnitt.

Hvordan håndtere nøkkelfeil i Python

La oss lære hvordan du håndterer KeyErrors ved å bruke:

  • Hvis ellers betingede uttalelser
  • Prøv-unntatt blokker
  • Ordbokmetoden .get()

#1. Bruke If-Else betingede erklæringer

En av de enkleste måtene å håndtere KeyErrors i Python på er å bruke if-else betingede setninger.

I Python har if-else-setninger følgende generelle syntaks:

 if condition:
 	# do this 
 else:
    # do something else 
  • Hvis betingelsen er True, blir utsagnene i if-kroppen utført, og
  • Hvis betingelsen er falsk, utføres uttalelsene i else-kroppen.

I dette eksemplet er betingelsen å sjekke om nøkkelen finnes i ordboken.

Hvis nøkkelen er tilstede i ordboken, vil in-operatøren returnere True, og hvis body vil bli utført skrive ut den tilsvarende verdien.

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økkelen ikke er tilstede i ordboken, returnerer in-operatøren False og else-teksten vil bli utført. Den skriver ut en melding om at nøkkelen 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. Bruke Try-Except-utsagn

En annen vanlig metode for å håndtere KeyError er å bruke try-except-setningene i Python.

Les gjennom følgende kodeblokk:

key = 'non-existent-key'
try:
  print(books_authors[key])
except KeyError:
  print('Sorry, this key does not exist!')
  • Prøv-blokken prøver å hente verdien som tilsvarer nøkkelen som er oppgitt.
  • Hvis nøkkelen ikke er tilstede, reiser tolken en KeyError som håndteres som et unntak innenfor unntaksblokken.

#3. Ved å bruke .get()-metoden

I Python kan du bruke den innebygde ordbokmetoden .get() for å håndtere manglende nøkler.

Den generelle syntaksen for å bruke get()-metoden er dict.get(key,default_value) der dict er et gyldig ordbokobjekt i Python.

  Slik gjør du Mac-tastaturets utmatingstast nyttig igjen

– Hvis nøkkelen finnes i ordboken, returnerer get()-metoden verdien.
– Ellers returnerer den standardverdien.

I dette eksemplet er nøkler en liste over nøkler hvis verdier vi vil ha tilgang til. Vi går gjennom nøkkellisten for å hente de tilsvarende verdiene fra books_authors-ordboken.

Her har vi brukt .get()-metoden med «Eksisterer ikke» som standardverdi.

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

I koden ovenfor:

  • For nøkler som finnes i books_authors-ordboken, returnerer .get()-metoden de tilsvarende verdiene.
  • Når nøklene ikke eksisterer, i dette tilfellet «Grit» og «Make Time», returnerer .get()-metoden standardverdien «Dos not exist».
# Output

Does not exist
Chris Bailey
Does not exist
Cal Newport

Alle metodene ovenfor hjelper oss med å håndtere nøkkelfeil. De er imidlertid detaljerte og krever at vi eksplisitt håndterer de manglende nøklene. Du kan forenkle denne prosessen ved å bruke en standardordbok i stedet for en vanlig ordbok.

Defaultdict i Python

Standarddiktet er en underklasse av ordbokklassen (dict). Så det arver oppførselen til en Python-ordbok. I tillegg håndterer den også manglende nøkler naturlig.

Standarddiktet er en beholderdatatype som er innebygd i Python-standardbiblioteket – inne i samlingsmodulen.

Så du må importere den til arbeidsmiljøet ditt:

from collections import defaultdict

Her er den generelle syntaksen for å bruke defaultdict:

defaultdict(default_factory)

Du kan spesifisere en callable som int, float eller list som standard_factory-attributtet. Hvis du ikke oppgir en verdi for default_factory, er den som standard Ingen.

Når nøkkelen du leter etter ikke er til stede, utløses __missing__()-metoden, og den utleder standardverdien fra default_factory. Den returnerer deretter denne standardverdien.

Oppsummert:

  • I Python returnerer en defaultdict standardverdien når nøkkelen ikke er til stede.
  • Den legger også til dette nøkkel-standardverdiparet til ordboken, som du deretter kan endre.

Python Defaultdict eksempler

Deretter skal vi kode noen få eksempler for å forstå hvordan Python defaultdict fungerer.

Defaultdict i Python med standard heltallsverdi

Importer først defaultdict fra samlingsmodulen.

from collections import defaultdict
import random

La oss lage et standarddiktpriser.

prices = defaultdict(int)

Vi fyller nå ut prisordlisten ved å bruke elementene i fruktlisten som nøkler. Og vi prøver tilfeldig verdier fra prislisten for å få verdiene.

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

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

La oss ta en titt på nøkkel-verdi-parene i prisene standarddict.

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

Som en vanlig Python-ordbok kan du få tilgang til verdiene til standardprisene ved å bruke tastene:

prices['apple']
# 23

La oss nå prøve å få tilgang til prisen på en frukt som ikke er til stede, for eksempel «oransje». Vi ser at den returnerer standardverdien på null.

prices['orange']
# 0

Hvis vi skriver ut ordboken, ser vi at en ny nøkkel «oransje» er lagt til med standard heltallsverdi null.

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

Defaultdict i Python med List som standardverdi

La oss definere students_majors som en standarddict av lister. Navnene på majorene er nøklene. Og verdiene er listene over studenter som følger hvert av hovedfagene, som matematikk, økonomi, informatikk og mer.

from collections import defaultdict
students_majors = defaultdict(list)

Hvis vi prøver å få tilgang til studentlisten som tilsvarer «Economics», returnerer defaultdict en tom liste; ingen nøkkelfeil!

students_majors['Economics']
# []

Vi har nå en tom liste tilordnet hovedfaget «Økonomi». Så vi kan nå legge til elementer til denne listen ved å bruke listemetoden .append().

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

Det er opprettet en oppføring for «Økonomi» i standardordboken for student_majors.

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

Du kan legge til flere studenter på listekartleggingen til hovedfaget Økonomi, legge til et nytt hovedfag og mye mer!

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

Konklusjon

Jeg håper denne opplæringen hjalp deg med å forstå hvordan og når du bør bruke defaultdict i Python. Etter å ha kjørt kodeeksemplene i denne opplæringen, kan du prøve å bruke defaultdict som den foretrukne datastrukturen i prosjektene dine når det er nødvendig.

  Hvordan skanne og fikse Log4j-sårbarheten?

Her er et sammendrag av det du har lært i denne opplæringen.

  • Når du arbeider med en Python-ordbok, vil du ofte støte på KeyErrors.
  • For å håndtere slike KeyErrors kan du bruke noen få detaljerte metoder. Du kan bruke betingede setninger, try-except-blokker eller .get()-metoden. Men standarddict-datatypen i samlingsmodulen kan forenkle denne KeyError-håndteringen.
  • Du kan bruke defaultdict(default_factory) der default_factory er en gyldig callable.
  • Når nøkkelen ikke er til stede i standarddiktet, legges standardverdien (utledet fra default_factory) og nøkkelen til standarddiktet.

Deretter kan du sjekke opplæringen om Python-kartfunksjonen.