Πώς και πότε πρέπει να χρησιμοποιείτε το Defaultdict στην Python;

Σε αυτό το σεμινάριο, θα μάθετε πώς να χρησιμοποιείτε το defaultdict από την ενότητα συλλογών της Python—για να χειρίζεστε καλύτερα τα KeyErrors—όταν εργάζεστε με λεξικά Python.

Στην Python, ένα λεξικό είναι μια ισχυρή ενσωματωμένη δομή δεδομένων που αποθηκεύει δεδομένα σε ζεύγη κλειδιών-τιμών. Θα χρησιμοποιήσετε τα πλήκτρα για να πατήσετε στο λεξικό και να αποκτήσετε πρόσβαση στις τιμές.

Ωστόσο, όταν έχετε πολλά λεξικά στο σενάριο Python σας που τροποποιούνται κατά την εκτέλεση του κώδικα, συχνά αντιμετωπίζετε σφάλματα κλειδιού. Και υπάρχουν μερικοί διαφορετικοί τρόποι που μπορείτε να τα χειριστείτε.

Σε αυτό το σεμινάριο, θα μάθετε:

  • Τι είναι τα βασικά σφάλματα και γιατί προκύπτουν
  • Πώς να χειριστείτε τα βασικά σφάλματα
  • Πώς να χρησιμοποιήσετε το defaultdict της Python, μια υποκλάση που κληρονομεί από την ενσωματωμένη κλάση dict, για να χειριστεί καλύτερα τα κλειδιά που λείπουν

Ας ξεκινήσουμε!

Τι είναι τα βασικά σφάλματα στην Python;

Όταν ορίζετε ένα λεξικό Python, θα πρέπει να φροντίζετε να διασφαλίζετε τα εξής:

  • Τα πλήκτρα πρέπει να είναι μοναδικά – χωρίς καμία επανάληψη.
  • Όταν χρησιμοποιείτε ένα υπάρχον iterable ως πλήκτρα ενός λεξικού, θα πρέπει να προτιμάτε να χρησιμοποιείτε μια αμετάβλητη συλλογή όπως μια πλειάδα.

Άρα ένα κλειδί είναι έγκυρο μόνο αν υπάρχει στο λεξικό. Διαφορετικά οδηγεί σε βασικά σφάλματα.

Σκεφτείτε το παρακάτω λεξικό, βιβλία_συγγραφείς, στο οποίο τα κλειδιά είναι τα ονόματα των βιβλίων και οι τιμές είναι τα ονόματα των συγγραφέων.

Μπορείτε να κωδικοποιήσετε μαζί με αυτό το σεμινάριο σε Python REPL.

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

Μπορείτε να χρησιμοποιήσετε το κλειδί (όνομα του βιβλίου) για να αποκτήσετε πρόσβαση στο όνομα του συγγραφέα.

books_authors['Hyperfocus']
'Chris Bailey'

Για να αποκτήσετε πρόσβαση σε όλα τα ζεύγη κλειδιών-τιμών στο λεξικό, μπορείτε να καλέσετε τη μέθοδο items() στο αντικείμενο λεξικού, όπως φαίνεται παρακάτω:

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

Εάν προσπαθήσετε να αποκτήσετε πρόσβαση στην τιμή ενός κλειδιού που δεν υπάρχει στο λεξικό, ο διερμηνέας Python δημιουργεί ένα KeyError. Αντιμετωπίζουμε KeyError όταν προσπαθούμε να αποκτήσουμε πρόσβαση στην τιμή των κλειδιών που δεν υπάρχουν, δηλαδή, “Grit” και “un-υπάρχον κλειδί”.

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'

Πώς χειρίζεστε λοιπόν τα KeyErrors στην Python;

  Πώς να διορθώσετε το "Δεν βρέθηκε κάμερα" στο Microsoft Teams

Υπάρχουν λίγοι τρόποι για να το κάνετε και θα τους μάθουμε στην επόμενη ενότητα.

Πώς να χειριστείτε βασικά σφάλματα στην Python

Ας μάθουμε πώς να χειριζόμαστε βασικά σφάλματα χρησιμοποιώντας:

  • Αν-άλλο δηλώσεις υπό όρους
  • Δοκιμάστε-εκτός μπλοκ
  • Η μέθοδος λεξικού .get()

#1. Χρήση δηλώσεων υπό όρους If-Else

Ένας από τους πιο απλούς τρόπους χειρισμού KeyErrors στην Python είναι η χρήση των εντολών υπό όρους if-else.

Στην Python, οι εντολές if-else έχουν την ακόλουθη γενική σύνταξη:

 if condition:
 	# do this 
 else:
    # do something else 
  • Εάν η συνθήκη είναι True, οι δηλώσεις στο σώμα if εκτελούνται και
  • Εάν η συνθήκη είναι False, οι εντολές στο σώμα else εκτελούνται.

Σε αυτό το παράδειγμα, η προϋπόθεση είναι να ελέγξετε εάν το κλειδί υπάρχει στο λεξικό.

Εάν το κλειδί υπάρχει στο λεξικό, ο τελεστής in θα επιστρέψει True και εάν το σώμα θα εκτελεστεί εκτυπώνοντας την αντίστοιχη τιμή.

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

# Output
# Neil Pasricha

Εάν το κλειδί δεν υπάρχει στο λεξικό, ο τελεστής in επιστρέφει False και το άλλο σώμα θα εκτελεστεί. Εκτυπώνει ένα μήνυμα ότι το κλειδί δεν υπάρχει.

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. Χρήση δηλώσεων δοκιμής-εκτός

Μια άλλη κοινή μέθοδος για τον χειρισμό του KeyError είναι η χρήση των εντολών try-except στην Python.

Διαβάστε το ακόλουθο μπλοκ κώδικα:

key = 'non-existent-key'
try:
  print(books_authors[key])
except KeyError:
  print('Sorry, this key does not exist!')
  • Το μπλοκ try προσπαθεί να ανακτήσει την τιμή που αντιστοιχεί στο κλειδί που παρέχεται.
  • Εάν το κλειδί δεν υπάρχει, ο διερμηνέας δημιουργεί ένα KeyError το οποίο αντιμετωπίζεται ως εξαίρεση εντός του μπλοκ εκτός.

#3. Χρησιμοποιώντας τη μέθοδο .get().

Στην Python, μπορείτε να χρησιμοποιήσετε την ενσωματωμένη μέθοδο λεξικού .get() για να χειριστείτε τα κλειδιά που λείπουν.

Η γενική σύνταξη για τη χρήση της μεθόδου get() είναι dict.get(key,default_value) όπου το dict είναι ένα έγκυρο αντικείμενο λεξικού στην Python.

– Εάν το κλειδί υπάρχει στο λεξικό, τότε η μέθοδος get() επιστρέφει την τιμή.
– Διαφορετικά, επιστρέφει την προεπιλεγμένη τιμή.

  Πώς να κάνετε το χειριστήριό σας να μιμείται έναν ελεγκτή Xbox

Σε αυτό το παράδειγμα, τα κλειδιά είναι μια λίστα κλειδιών στις τιμές των οποίων θα θέλαμε να έχουμε πρόσβαση. Κάνουμε βρόχο στη λίστα κλειδιών για να ανακτήσουμε τις αντίστοιχες τιμές από το λεξικό books_authors.

Εδώ, χρησιμοποιήσαμε τη μέθοδο .get() με “Δεν υπάρχει” ως προεπιλεγμένη τιμή.

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

Στον παραπάνω κώδικα:

  • Για κλειδιά που υπάρχουν στο λεξικό books_authors, η μέθοδος .get() επιστρέφει τις αντίστοιχες τιμές.
  • Όταν τα κλειδιά δεν υπάρχουν, σε αυτήν την περίπτωση, «Grit» και «Make Time», η μέθοδος .get() επιστρέφει την προεπιλεγμένη τιμή «Δεν υπάρχει».
# Output

Does not exist
Chris Bailey
Does not exist
Cal Newport

Όλες οι παραπάνω μέθοδοι μας βοηθούν στον χειρισμό βασικών σφαλμάτων. Ωστόσο, είναι περίεργα και απαιτούν από εμάς να χειριστούμε ρητά τα κλειδιά που λείπουν. Μπορείτε να απλοποιήσετε αυτήν τη διαδικασία χρησιμοποιώντας μια προεπιλογή αντί για ένα κανονικό λεξικό.

Προεπιλογή στην Python

Το defaultdict είναι μια υποκλάση της κλάσης λεξικού (dict). Άρα κληρονομεί τη συμπεριφορά ενός λεξικού Python. Επιπλέον, χειρίζεται επίσης εγγενώς τα κλειδιά που λείπουν.

Η προεπιλογή είναι ένας τύπος δεδομένων κοντέινερ που είναι ενσωματωμένος στην τυπική βιβλιοθήκη Python – μέσα στη λειτουργική μονάδα συλλογών.

Επομένως, πρέπει να το εισαγάγετε στο περιβάλλον εργασίας σας:

from collections import defaultdict

Ακολουθεί η γενική σύνταξη για τη χρήση του defaultdict:

defaultdict(default_factory)

Μπορείτε να καθορίσετε ένα καλούμενο όπως int, float ή list ως το χαρακτηριστικό default_factory. Εάν δεν παρέχετε μια τιμή για το default_factory, ορίζεται από προεπιλογή None.

Όταν το κλειδί που αναζητάτε δεν υπάρχει, ενεργοποιείται η μέθοδος __missing__() και συμπεραίνει την προεπιλεγμένη τιμή από το default_factory. Στη συνέχεια, επιστρέφει αυτήν την προεπιλεγμένη τιμή.

Συνοψίζοντας:

  • Στην Python, ένα defaultdict επιστρέφει την προεπιλεγμένη τιμή όταν το κλειδί δεν υπάρχει.
  • Προσθέτει επίσης αυτό το ζεύγος κλειδιού-προεπιλεγμένης τιμής στο λεξικό, το οποίο μπορείτε στη συνέχεια να τροποποιήσετε.

Παραδείγματα προεπιλογής Python

Στη συνέχεια, θα κωδικοποιήσουμε μερικά παραδείγματα για να κατανοήσουμε πώς λειτουργεί η προεπιλογή της Python.

Προεπιλογή στην Python με προεπιλεγμένη ακέραια τιμή

Αρχικά, εισαγάγετε την προεπιλογή από τη λειτουργική μονάδα συλλογών.

from collections import defaultdict
import random

Ας δημιουργήσουμε μια προεπιλεγμένη τιμή.

prices = defaultdict(int)

Τώρα συμπληρώνουμε το λεξικό τιμών χρησιμοποιώντας τα στοιχεία της λίστας φρούτων ως κλειδιά. Και δειγματίζουμε τυχαία τιμές από τον τιμοκατάλογο για να λάβουμε τις τιμές.

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

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

Ας ρίξουμε μια ματιά στα ζεύγη κλειδιών-τιμών στην προεπιλογή τιμών.

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

Όπως ένα κανονικό λεξικό Python, μπορείτε να έχετε πρόσβαση στις τιμές των προεπιλεγμένων τιμών χρησιμοποιώντας τα κλειδιά:

prices['apple']
# 23

Τώρα, ας προσπαθήσουμε να αποκτήσουμε πρόσβαση στην τιμή ενός φρούτου που δεν υπάρχει, ας πούμε, «πορτοκαλί». Βλέπουμε ότι επιστρέφει την προεπιλεγμένη τιμή μηδέν.

prices['orange']
# 0

Εάν εκτυπώσουμε το λεξικό, βλέπουμε ότι έχει προστεθεί ένα νέο κλειδί ‘πορτοκαλί’ με την προεπιλεγμένη ακέραια τιμή μηδέν.

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

Προεπιλογή στην Python με Λίστα ως προεπιλεγμένη τιμή

Ας ορίσουμε student_majors ως προεπιλογή λιστών. Τα ονόματα των μεγάλων είναι τα κλειδιά. Και οι αξίες είναι οι λίστες των μαθητών που επιδιώκουν καθεμία από τις ειδικότητες, όπως τα μαθηματικά, τα οικονομικά, την επιστήμη των υπολογιστών και πολλά άλλα.

from collections import defaultdict
students_majors = defaultdict(list)

Εάν προσπαθήσουμε να αποκτήσουμε πρόσβαση στη λίστα μαθητών που αντιστοιχεί στο ‘Economics’, το defaultdict επιστρέφει μια κενή λίστα. χωρίς βασικά λάθη!

students_majors['Economics']
# []

Τώρα έχουμε μια κενή λίστα που έχει αντιστοιχιστεί στην κατηγορία «Οικονομικά». Έτσι μπορούμε τώρα να προσθέσουμε στοιχεία σε αυτήν τη λίστα χρησιμοποιώντας τη μέθοδο λίστας .append().

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

Στο προεπιλεγμένο λεξικό student_majors έχει δημιουργηθεί μια καταχώριση για το ‘Economics’.

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

Μπορείτε να προσθέσετε περισσότερους μαθητές στη λίστα αντιστοίχισης στην κατεύθυνση των Οικονομικών, να προσθέσετε μια νέα κατεύθυνση και πολλά άλλα!

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

συμπέρασμα

Ελπίζω αυτό το σεμινάριο να σας βοήθησε να καταλάβετε πώς και πότε πρέπει να χρησιμοποιείτε το defaultdict στην Python. Αφού εκτελέσετε τα παραδείγματα κώδικα σε αυτό το σεμινάριο, μπορείτε να δοκιμάσετε να χρησιμοποιήσετε το defaultdict ως την προτιμώμενη δομή δεδομένων στα έργα σας όταν χρειάζεται.

  Πώς να παρακολουθήσετε το iPlayer του BBC στις ΗΠΑ ή στο εξωτερικό

Ακολουθεί μια περίληψη των όσων μάθατε σε αυτό το σεμινάριο.

  • Όταν εργάζεστε με ένα λεξικό Python, θα αντιμετωπίζετε συχνά σφάλματα κλειδιού.
  • Για να χειριστείτε τέτοια σφάλματα κλειδιού μπορείτε να χρησιμοποιήσετε μερικές αναλυτικές μεθόδους. Μπορείτε να χρησιμοποιήσετε δηλώσεις υπό όρους, μπλοκ try-except ή τη μέθοδο .get(). Ωστόσο, ο προεπιλεγμένος τύπος δεδομένων στη λειτουργική μονάδα συλλογών μπορεί να απλοποιήσει αυτόν τον χειρισμό σφαλμάτων κλειδιού.
  • Μπορείτε να χρησιμοποιήσετε το defaultdict(default_factory) όπου το default_factory είναι έγκυρη δυνατότητα κλήσης.
  • Όταν το κλειδί δεν υπάρχει στην προεπιλεγμένη τιμή, η προεπιλεγμένη τιμή (συνάγεται από το default_factory) και το κλειδί προστίθενται στην προεπιλεγμένη τιμή.

Στη συνέχεια, ρίξτε μια ματιά στο σεμινάριο σχετικά με τη λειτουργία χάρτη Python.