I denne veiledningen vil du lære å bruke defaultdict
fra Pythons collections
-modul for en bedre håndtering av KeyError
-unntak når du arbeider med ordbøker i Python.
I Python er en ordbok en kraftig, innebygd datastruktur som lagrer informasjon i nøkkel-verdi-par. Du bruker nøklene for å få tilgang til de tilhørende verdiene i ordboken.
Når du har flere ordbøker i Python-skriptet ditt som endres under kjøring, vil du ofte støte på KeyError
-unntak. Det finnes ulike måter å håndtere disse feilene på.
I denne veiledningen vil du lære:
- Hva
KeyError
-unntak er og hvorfor de oppstår. - Hvordan håndtere
KeyError
-unntak. - Hvordan bruke Pythons
defaultdict
, en subklasse som arver fra den innebygdedict
-klassen, for en forbedret håndtering av manglende nøkler.
La oss begynne!
Hva er KeyError
-unntak i Python?
Når du definerer en Python-ordbok, må du huske følgende:
- Nøklene må være unike – uten duplikater.
- Når du bruker en eksisterende itererbar som nøkler til en ordbok, bør du foretrekke å bruke en uforanderlig samling som en tuple.
En nøkkel er kun gyldig hvis den eksisterer i ordboken. Hvis ikke, vil det føre til et KeyError
-unntak.
La oss se på følgende ordbok, bøker_forfattere
, der nøklene er titler på bøker og verdiene er navnene på forfatterne.
Du kan skrive koden sammen med denne veiledningen i en Python REPL.
bøker_forfattere = { 'Deep Work':'Cal Newport', 'Hyperfocus':'Chris Bailey', 'Pivot':'Jenny Blake', 'The Happiness Equation':'Neil Pasricha' }
Du kan bruke en nøkkel (tittelen på boken) for å få tilgang til forfatterens navn.
bøker_forfattere['Hyperfocus'] 'Chris Bailey'
For å få tilgang til alle nøkkel-verdi-parene i ordboken, kan du kalle items()
-metoden på ordbokobjektet, som vist nedenfor:
for bok, forfatter in bøker_forfattere.items(): print(f"'{bok}' av {forfatter}")
'Deep Work' av Cal Newport 'Hyperfocus' av Chris Bailey 'Pivot' av Jenny Blake 'The Happiness Equation' av Neil Pasricha
Hvis du prøver å få tilgang til verdien av en nøkkel som ikke er til stede i ordboken, vil Python-tolken heve et KeyError
-unntak. 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».
bøker_forfattere['Grit']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-6-e1a4486f5ced> in <module> ----> 1 bøker_forfattere['Grit'] KeyError: 'Grit'
bøker_forfattere['ikke-eksisterende-nøkkel']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-7-a3efd56f69e5> in <module> ----> 1 bøker_forfattere['ikke-eksisterende-nøkkel'] KeyError: 'ikke-eksisterende-nøkkel'
Så, hvordan håndterer du KeyError
-unntak i Python?
Det er flere måter å gjøre det på, og vi vil se på dem i neste avsnitt.
Hvordan håndtere KeyError
-unntak i Python
La oss se hvordan du kan håndtere KeyError
-unntak ved hjelp av:
if-else
betingede setningertry-except
-blokker- Ordbok-metoden
.get()
#1. Bruk av if-else
betingede setninger
En av de enkleste måtene å håndtere KeyError
-unntak i Python er å bruke if-else
betingede setninger.
I Python har if-else
-setninger følgende generelle syntaks:
if betingelse: # gjør dette else: # gjør noe annet
- Hvis betingelsen er
True
, utføres setningene iif
-blokken. - Hvis betingelsen er
False
, utføres setningene ielse
-blokken.
I dette eksemplet er betingelsen å sjekke om nøkkelen eksisterer i ordboken.
Hvis nøkkelen er til stede i ordboken, vil in
-operatoren returnere True
, og if
-blokken vil bli utført, og den tilsvarende verdien vil skrives ut.
nøkkel = 'The Happiness Equation' if nøkkel in bøker_forfattere: print(bøker_forfattere[nøkkel]) else: print('Beklager, denne nøkkelen eksisterer ikke!') # Output # Neil Pasricha
Hvis nøkkelen ikke er til stede i ordboken, returnerer in
-operatoren False
, og else
-blokken vil bli utført. Den vil skrive ut en melding om at nøkkelen ikke er til stede.
nøkkel = 'ikke-eksisterende-nøkkel' if nøkkel in bøker_forfattere: print(bøker_forfattere[nøkkel]) else: print('Beklager, denne nøkkelen eksisterer ikke!') # Output # Beklager, denne nøkkelen eksisterer ikke!
#2. Bruk av try-except
-setninger
En annen vanlig metode for å håndtere KeyError
-unntak er å bruke try-except
-setninger i Python.
Se på følgende kodeblokk:
nøkkel = 'ikke-eksisterende-nøkkel' try: print(bøker_forfattere[nøkkel]) except KeyError: print('Beklager, denne nøkkelen eksisterer ikke!')
try
-blokken forsøker å hente verdien som tilsvarer den angitte nøkkelen.- Hvis nøkkelen ikke er til stede, vil tolken heve et
KeyError
-unntak, som håndteres iexcept
-blokken.
#3. Bruk av .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 ordbok.get(nøkkel, standard_verdi)
, der ordbok
er et gyldig ordbokobjekt i Python.
– Hvis nøkkelen finnes i ordboken, returnerer get()
-metoden verdien.
– Hvis ikke, returnerer den standard_verdi
.
I dette eksemplet er nøkler
en liste over nøkler vi ønsker å få tilgang til verdien av. Vi går gjennom listen for å hente de tilsvarende verdiene fra bøker_forfattere
-ordboken.
Her har vi brukt .get()
-metoden med «Eksisterer ikke» som standard_verdi
.
nøkler = ['Grit','Hyperfocus','Make Time','Deep Work'] for nøkkel in nøkler: print(bøker_forfattere.get(nøkkel,'Eksisterer ikke'))
I koden over:
- For nøkler som finnes i
bøker_forfattere
-ordboken, returnerer.get()
-metoden de tilsvarende verdiene. - Når nøklene ikke eksisterer, i dette tilfellet «Grit» og «Make Time», returnerer
.get()
-metodenstandard_verdi
«Eksisterer ikke».
# Output Eksisterer ikke Chris Bailey Eksisterer ikke Cal Newport
Alle metodene ovenfor hjelper oss med å håndtere KeyError
-unntak. De er imidlertid detaljerte og krever at vi eksplisitt håndterer de manglende nøklene. Du kan forenkle denne prosessen ved å bruke en defaultdict
i stedet for en vanlig ordbok.
defaultdict
i Python
En defaultdict
er en subklasse av ordbokklassen (dict
). Den arver dermed oppførselen til en Python-ordbok. I tillegg håndterer den også manglende nøkler på en mer naturlig måte.
defaultdict
er en beholdertype som er innebygd i Pythons standardbibliotek – i collections
-modulen.
Du må derfor 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 default_factory
-attributtet. Hvis du ikke oppgir en verdi for default_factory
, er den som standard None
.
Når nøkkelen du leter etter ikke er til stede, utløses __missing__()
-metoden, og den avleder standardverdien fra default_factory
. Deretter returnerer den denne standardverdien.
Oppsummert:
- I Python vil en
defaultdict
returnere 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
La oss kode noen eksempler for å forstå hvordan Python defaultdict
fungerer.
defaultdict
i Python med standard heltallsverdi
Importer først defaultdict
fra collections
-modulen.
from collections import defaultdict import random
La oss lage en defaultdict
ved navn priser
.
priser = defaultdict(int)
Vi fyller nå ut priser
-ordboken ved å bruke elementene i fruktlisten som nøkler. Vi trekker tilfeldige verdier fra pris_liste
for å få verdiene.
pris_liste = [10,23,12,19,5] frukter = ['eple','jordbær','granateple','blåbær'] for frukt in frukter: priser[frukt] = random.choice(pris_liste)
La oss se på nøkkel-verdi-parene i priser
defaultdict
.
print(priser.items())
dict_items([('eple', 12), ('blåbær', 19), ('granateple', 5), ('jordbær', 10)])
Som en vanlig Python-ordbok kan du få tilgang til verdiene i priser
defaultdict
ved å bruke nøklene:
priser['eple'] # 23
La oss nå prøve å få tilgang til prisen på en frukt som ikke er til stede, for eksempel «appelsin». Vi ser at den returnerer standardverdien null.
priser['appelsin'] # 0
Hvis vi skriver ut ordboken, ser vi at en ny nøkkel «appelsin» er lagt til med standard heltallsverdi null.
print(priser.items())
dict_items([('eple', 12), ('blåbær', 19), ('granateple', 5), ('jordbær', 10), ('appelsin', 0)])
defaultdict
i Python med list
som standardverdi
La oss definere studenter_studier
som en defaultdict
av lister. Navnene på studiene er nøklene. Og verdiene er listene over studenter som følger hvert av fagene, som matematikk, økonomi, informatikk og mer.
from collections import defaultdict studenter_studier = defaultdict(list)
Hvis vi prøver å få tilgang til studentlisten som tilsvarer «Økonomi», returnerer defaultdict
en tom liste. Ingen KeyError
!
studenter_studier['Økonomi'] # []
Vi har nå en tom liste knyttet til studiet «Økonomi». Vi kan nå legge til elementer i denne listen ved hjelp av listemetoden .append()
.
studenter_studier['Økonomi'].append('Alex')
Det er opprettet en oppføring for «Økonomi» i studenter_studier
defaultdict
.
print(studenter_studier)
defaultdict(<class 'list'>, {'Økonomi': ['Alex']})
Du kan legge til flere studenter i listekartleggingen for studiet «Økonomi», legge til et nytt studie og mye mer!
studenter_studier['Økonomi'].append('Bob') studenter_studier['Matematikk'].append('Laura') print(studenter_studier)
defaultdict(<class 'list'>, {'Økonomi': ['Alex', 'Bob'], 'Matematikk': ['Laura']})
Konklusjon
Jeg håper denne veiledningen har hjulpet deg med å forstå hvordan og når du bør bruke defaultdict
i Python. Etter å ha kjørt kodeeksemplene i denne veiledningen, kan du prøve å bruke defaultdict
som den foretrukne datastrukturen i prosjektene dine der det er nødvendig.
Her er en oppsummering av det du har lært i denne veiledningen.
- Når du arbeider med en Python-ordbok, vil du ofte støte på
KeyError
-unntak. - For å håndtere slike
KeyError
-unntak, kan du bruke et par detaljerte metoder. Du kan bruke betingede setninger,try-except
-blokker eller.get()
-metoden. Men datatypendefaultdict
icollections
-modulen kan forenkle denne håndteringen. - Du kan bruke
defaultdict(default_factory)
, derdefault_factory
er en gyldig «callable». - Når nøkkelen ikke er til stede i en
defaultdict
, legges standardverdien (avledet fradefault_factory
) og nøkkelen tildefaultdict
.
Deretter kan du sjekke veiledningen om Python-kartfunksjonen.