Επεξήγηση δομής δεδομένων λεξικού Python

Το λεξικό είναι μια από τις πιο χρησιμοποιούμενες δομές δεδομένων στο Python. Ένα λεξικό είναι μια μη ταξινομημένη συλλογή αντικειμένων και συνήθως έχουμε κλειδιά και τιμές αποθηκευμένες σε ένα λεξικό. Ας δούμε μερικά παραδείγματα για το πώς χρησιμοποιείται συνήθως το λεξικό.

# dictionary declaration 1 dict1 = dict() # dictionary declaration 2 dict2 = {} # Add items to the dictionary # The syntax to add and retrieve items is same for either of the two objects we defined above. key = "X" value = "Y" dict1[key] = value # The dictionary doesn't have any specific data-type. # So, the values can be pretty diverse. dict1[key] = dict2

Ας δούμε τώρα μερικούς τρόπους ανάκτησης.

# Since "X" exists in our dictionary, this will retrieve the value value = dict1[key] # This key doesn't exist in the dictionary. # So, we will get a `KeyError` value = dict1["random"]

Αποφυγή KeyError: Χρησιμοποιήστε τη λειτουργία .get

Σε περίπτωση που το δεδομένο κλειδί δεν υπάρχει στο λεξικό, η Python θα ρίξει ένα KeyError. Υπάρχει μια απλή λύση για αυτό. Ας δούμε πώς μπορούμε να αποφύγουμε τη KeyErrorχρήση της ενσωματωμένης .getλειτουργίας για λεξικά.

dict_ = {} # Some random key random_key = "random" # The most basic way of doing this is to check if the key # exists in the dictionary or not and only retrieve if the # key exists. Otherwise not. if random_key in dict_: print(dict_[random_key]) else: print("Key = {} doesn't exist in the dictionary".format(dict_))

Πολλές φορές λαμβάνουμε μια προεπιλεγμένη τιμή όταν το κλειδί δεν υπάρχει. Για παράδειγμα κατά την κατασκευή μετρητή. Υπάρχει ένας καλύτερος τρόπος για να λάβετε προεπιλεγμένες τιμές από το λεξικό σε περίπτωση που λείπουν κλειδιά αντί να βασίζεστε σε τυπικά if-else.

# Let's say we want to build a frequency counter for items in the following array arr = [1,2,3,1,2,3,4,1,2,1,4,1,2,3,1] freq = {} for item in arr: # Fetch a value of 0 in case the key doesn't exist. Otherwise, fetch the stored value freq[item] = freq.get(item, 0) + 1

Έτσι, get(, )είναι μια πρακτική λειτουργία για την ανάκτηση της προεπιλεγμένης τιμής για οποιοδήποτε δεδομένο κλειδί από το λεξικό. Το πρόβλημα με αυτήν τη μέθοδο έρχεται όταν θέλουμε να αντιμετωπίσουμε μεταβλητές δομές δεδομένων ως τιμές π.χ. listή set.

dict_ = {} # Some random key random_key = "random" dict_[random_key] = dict_.get(random_key, []).append("Hello World!") print(dict_) # {'random': None} dict_ = {} dict_[random_key] = dict_.get(random_key, set()).add("Hello World!") print(dict_) # {'random': None}

Είδατε το πρόβλημα;

Το νέο setή το listδεν ανατίθενται στο κλειδί του λεξικού Πρέπει να αντιστοιχίσουμε ένα νέο listή ένα setστο κλειδί σε περίπτωση που λείπει η τιμή και μετά appendή addαντίστοιχα. Ο Ley κοιτάζει ένα παράδειγμα για αυτό.

dict_ = {} dict_[random_key] = dict_.get(random_key, set()) dict_[random_key].add("Hello World!") print(dict_) # {'random': set(['Hello World!'])}. Yay!

Αποφυγή KeyError: Χρησιμοποιήστε το defaultdict

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

dict_[random_key] = dict_.get(random_key, set()) dict_[random_key].add("Hello World!")

μπορούν τώρα να συνδυαστούν σε ένα μόνο βήμα. Για παράδειγμα, π.χ.

from collections import defaultdict # Yet another random key random_key = "random_key" # list defaultdict list_dict_ = defaultdict(list) # set defaultdict set_dict_ = defaultdict(set) # integer defaultdict int_dict_ = defaultdict(int) list_dict_[random_key].append("Hello World!") set_dict_[random_key].add("Hello World!") int_dict_[random_key] += 1 """ defaultdict(, {'random_key': ['Hello World!']}) defaultdict(, {'random_key': {'Hello World!'}}) defaultdict(, {'random_key': 1}) """ print(list_dict_, set_dict_, int_dict_)

Επίσημα Έγγραφα