Cum și când ar trebui să utilizați Defaultdict în Python?

În acest tutorial, veți învăța cum să utilizați defaultdict din modulul de colecții Python – pentru a gestiona mai bine KeyErrors – atunci când lucrați cu dicționare Python.

În Python, un dicționar este o structură de date puternică încorporată care stochează datele în perechi cheie-valoare. Veți folosi tastele pentru a accesa dicționarul și a accesa valorile.

Cu toate acestea, atunci când aveți mai multe dicționare în scriptul dvs. Python care sunt modificate în timpul execuției codului, veți întâlni adesea KeyErrors. Și există câteva moduri diferite în care le puteți gestiona.

În acest tutorial, veți învăța:

  • Ce sunt KeyErrors și de ce apar
  • Cum să gestionați KeyErrors
  • Cum să utilizați defaultdict al lui Python, o subclasă care moștenește din clasa dict încorporată, pentru a gestiona mai bine cheile lipsă

Sa incepem!

Ce sunt KeyErrors în Python?

Când definiți un dicționar Python, trebuie să aveți grijă să vă asigurați de următoarele:

  • Cheile ar trebui să fie unice – fără nicio repetare.
  • Când utilizați un iterabil existent ca chei ale unui dicționar, ar trebui să preferați să utilizați o colecție imuabilă, cum ar fi un tuplu.

Deci o cheie este valabilă numai dacă este prezentă în dicționar; altfel duce la KeyErrors.

Luați în considerare următorul dicționar, books_authors, în care cheile sunt numele cărților, iar valorile sunt numele autorilor.

Puteți codifica împreună cu acest tutorial într-un REPL Python.

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

Puteți folosi cheia (numele cărții) pentru a accesa numele autorului.

books_authors['Hyperfocus']
'Chris Bailey'

Pentru a accesa toate perechile cheie-valoare din dicționar, puteți apela metoda items() din obiectul dicționar, după cum se arată mai jos:

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

Dacă încercați să accesați valoarea unei chei care nu este prezentă în dicționar, interpretul Python generează o KeyError. Ne întâlnim cu KeyError atunci când încercăm să accesăm valoarea cheilor care nu există, și anume „Grit” și „cheie inexistentă”.

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'

Deci, cum gestionați KeyErrors în Python?

  Partajarea cărților de vizită este digitalizată cu Mobilo

Există câteva moduri de a face acest lucru și le vom învăța în secțiunea următoare.

Cum să gestionați KeyErrors în Python

Să învățăm cum să gestionăm KeyErrors folosind:

  • Propoziții condiționale if-else
  • Încercați, cu excepția blocurilor
  • Metoda dicționarului .get()

#1. Folosind instrucțiuni condiționale If-Else

Una dintre cele mai simple moduri de a gestiona KeyErrors în Python este utilizarea instrucțiunilor condiționate if-else.

În Python, instrucțiunile if-else au următoarea sintaxă generală:

 if condition:
 	# do this 
 else:
    # do something else 
  • Dacă condiția este adevărată, instrucțiunile din corpul if sunt executate și
  • Dacă condiția este False, instrucțiunile din corpul else sunt executate.

În acest exemplu, condiția este să verificați dacă cheia este prezentă în dicționar.

Dacă cheia este prezentă în dicționar, operatorul in va returna True, iar dacă body va fi executat imprimând valoarea corespunzătoare.

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

# Output
# Neil Pasricha

Dacă cheia nu este prezentă în dicționar, operatorul in returnează False și corpul else va fi executat. Tipărește un mesaj că cheia nu este prezentă.

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. Utilizarea instrucțiunilor Try-Except

O altă metodă comună de a gestiona KeyError este utilizarea instrucțiunilor try-except în Python.

Citiți următorul bloc de cod:

key = 'non-existent-key'
try:
  print(books_authors[key])
except KeyError:
  print('Sorry, this key does not exist!')
  • Blocul try încearcă să recupereze valoarea corespunzătoare cheii furnizate.
  • Dacă cheia nu este prezentă, interpretul generează o KeyError care este tratată ca o excepție în blocul except.

#3. Folosind metoda .get().

În Python, puteți utiliza metoda de dicționar încorporată .get() pentru a gestiona cheile lipsă.

Sintaxa generală pentru a utiliza metoda get() este dict.get(key,default_value) unde dict este un obiect dicționar valid în Python.

  Cum mă dezabonez de la Quora Digest

– Dacă cheia este prezentă în dicționar, atunci metoda get() returnează valoarea.
– În caz contrar, returnează valoarea implicită.

În acest exemplu, chei este o listă de chei ale căror valori am dori să le accesăm. Parcurgem lista de chei pentru a prelua valorile corespunzătoare din dicționarul books_authors.

Aici, am folosit metoda .get() cu „Nu există” ca valoare implicită.

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

În codul de mai sus:

  • Pentru cheile care sunt prezente în dicționarul books_authors, metoda .get() returnează valorile corespunzătoare.
  • Când cheile nu există, în acest caz, „Grit” și „Make Time”, metoda .get() returnează valoarea implicită „Nu există”.
# Output

Does not exist
Chris Bailey
Does not exist
Cal Newport

Toate metodele de mai sus ne ajută în gestionarea erorilor cheie. Cu toate acestea, ele sunt detaliate și ne solicită să gestionăm în mod explicit cheile lipsă. Puteți simplifica acest proces folosind un defaultdict în loc de un dicționar obișnuit.

Defaultdict în Python

Defaultdict este o subclasă a clasei dicționar (dict). Deci moștenește comportamentul unui dicționar Python. În plus, gestionează și cheile lipsă în mod nativ.

Defaultdict este un tip de date container care este încorporat în biblioteca standard Python – în interiorul modulului de colecții.

Deci, trebuie să-l importați în mediul dvs. de lucru:

from collections import defaultdict

Iată sintaxa generală pentru a utiliza defaultdict:

defaultdict(default_factory)

Puteți specifica un apelabil, cum ar fi int, float sau list, ca atribut default_factory. Dacă nu furnizați o valoare pentru default_factory, aceasta este implicită None.

Când cheia pe care o căutați nu este prezentă, este declanșată metoda __missing__() și deduce valoarea implicită din default_factory. Apoi returnează această valoare implicită.

În concluzie:

  • În Python, un defaultdict returnează valoarea implicită atunci când cheia nu este prezentă.
  • De asemenea, adaugă această pereche cheie-valoare implicită la dicționar, pe care apoi o puteți modifica.

Exemple Python Defaultdict

În continuare, vom codifica câteva exemple pentru a înțelege cum funcționează Python defaultdict.

Defaultdict în Python cu valoare întreagă implicită

Mai întâi, importați defaultdict din modulul de colecții.

from collections import defaultdict
import random

Să creăm prețuri implicite.

prices = defaultdict(int)

Acum completăm dicționarul de prețuri folosind articolele din lista de fructe ca chei. Și eșantionăm aleatoriu valori din price_list pentru a obține valorile.

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

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

Să aruncăm o privire la perechile cheie-valoare din preturile implicite.

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

La fel ca un dicționar Python obișnuit, puteți accesa valorile prețurilor implicite folosind tastele:

prices['apple']
# 23

Acum, să încercăm să accesăm prețul unui fruct care nu este prezent, să zicem „portocaliu”. Vedem că returnează valoarea implicită zero.

prices['orange']
# 0

Dacă tipărim dicționarul, vedem că a fost adăugată o nouă cheie „portocaliu” cu valoarea integrală implicită zero.

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

Defaultdict în Python cu Listă ca valoare implicită

Să definim student_majors ca un dictat implicit al listelor. Numele majorilor sunt cheile. Și valorile sunt listele de studenți care urmează fiecare specializare, cum ar fi matematică, economie, informatică și multe altele.

from collections import defaultdict
students_majors = defaultdict(list)

Dacă încercăm să accesăm lista de studenți corespunzătoare „Economie”, defaultdict returnează o listă goală; fără erori de cheie!

students_majors['Economics']
# []

Acum avem o listă goală mapată la specializarea „Economie”. Deci acum putem adăuga elemente la această listă folosind metoda list .append().

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

A fost creată o intrare pentru „Economics” în dicționarul standard student_majors.

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

Puteți adăuga mai mulți studenți la maparea listei la specializarea Economie, puteți adăuga o nouă specializare și multe altele!

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

Concluzie

Sper că acest tutorial v-a ajutat să înțelegeți cum și când ar trebui să utilizați defaultdict în Python. După ce rulați exemplele de cod din acest tutorial, puteți încerca să utilizați defaultdict ca structură de date preferată în proiectele dvs. atunci când este necesar.

  Ce este Uber One și care sunt beneficiile acestuia?

Iată un rezumat a ceea ce ați învățat în acest tutorial.

  • Când lucrați cu un dicționar Python, veți întâlni adesea KeyErrors.
  • Pentru a gestiona astfel de KeyErrors puteți folosi câteva metode detaliate. Puteți utiliza instrucțiuni condiționale, blocuri try-except sau metoda .get(). Dar tipul de date defaultdict din modulul de colecții poate simplifica această gestionare KeyError.
  • Puteți utiliza defaultdict(default_factory) unde default_factory este un apelabil valid.
  • Când cheia nu este prezentă în defaultdict, valoarea implicită (dedusă din default_factory) și cheia sunt adăugate la defaultdict.

Apoi, consultați tutorialul despre funcția de hartă Python.