Λε

Λεξικά σε Python

37 ασκήσεις

Σχετικά με την έννοια Λεξικά

Ένα λεξικό (dict) στην Python είναι μια δομή δεδομένων που συσχετίζει hashable κλειδιά με τιμές και είναι γνωστό σε άλλες γλώσσες προγραμματισμού ως hash table μεταβλητού μεγέθους, hashmap ή associative array. Τα λεξικά είναι ο μόνος ενσωματωμένος τύπος αντιστοίχισης της Python.

Τα keys πρέπει να είναι hashable και μοναδικά μέσα στο λεξικό. Οι τύποι κλειδιών μπορούν να περιλαμβάνουν number, str ή tuple (με αμετάβλητες τιμές). Δεν μπορούν να περιέχουν μεταβλητές δομές δεδομένων όπως list, dict ή set. Από την Python 3.7 και μετά, η σειρά των κλειδιών σε ένα dict είναι εγγυημένη ότι είναι η σειρά με την οποία εισάγονται οι καταχωρίσεις.

Τα values μπορούν να είναι οποιουδήποτε τύπου δεδομένων ή δομής. Οι τιμές μπορούν επίσης να εμφωλεύονται αυθαίρετα, ώστε να περιλαμβάνουν λίστες από λίστες, υπο-λεξικά και άλλες προσαρμοσμένες ή σύνθετες δομές δεδομένων.

Όταν δίνεται ένα key, τα λεξικά μπορούν να ανακτήσουν ένα value σε (κατά μέσο όρο) σταθερό χρόνο (ανεξάρτητα από τον αριθμό των καταχωρίσεων). Σε σύγκριση με την αναζήτηση μιας τιμής μέσα σε μια list ή ένα array (χωρίς να γνωρίζεις τη θέση του index), ένα dict χρησιμοποιεί σημαντικά περισσότερη μνήμη, αλλά έχει πολύ γρήγορη ανάκτηση.

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

Δημιουργία Λεξικού

Τα λεξικά μπορούν να δημιουργηθούν με πολλούς διαφορετικούς τρόπους, όπως:

  • Με τη μέθοδο κλάσης fromkeys().
  • Με κατανόηση λεξικού.
  • Με συγχώνευση δύο λεξικών μέσω αποσυσκευασίας (**).
  • Με συγχώνευση λεξικών μέσω του τελεστή | (update).
  • Με έναν βρόχο για να προσθέτεις επαναληπτικά καταχωρίσεις σε ένα προηγουμένως δημιουργημένο κενό dict.

Οι δύο πιο απλές μέθοδοι είναι ο κατασκευαστής του λεξικού και το literal του λεξικού.

Ο Κατασκευαστής του Λεξικού

Το dict() (ο κατασκευαστής της κλάσης dict) μπορεί να χρησιμοποιηθεί με οποιοδήποτε iterable από ζεύγη key, value. Μπορεί επίσης να κληθεί με μια σειρά ορισμάτων <name>=<value>:

# Passing a list of key,value tuples.
>>> wombat = dict([('name', 'Wombat'),
...              ('speed', 23),
...              ('land_animal', True)])
{'name': 'Wombat', 'speed': 23, 'land_animal': True}


# Using key=value arguments.
>>> bear = dict(name="Black Bear",
...             speed=40,
...             land_animal=True)
{'name': 'Black Bear', 'speed': 40, 'land_animal': True}

Η τεκμηρίωση για τα dict περιγράφει επιπλέον παραλλαγές και επιλογές στη χρήση του κατασκευαστή.

Τα Literals του Λεξικού

Ένα λεξικό μπορεί επίσης να εισαχθεί άμεσα ως literal λεξικού, χρησιμοποιώντας άγκιστρα ({}) που περικλείουν ζεύγη key : value. Οι καταχωρίσεις που περικλείονται στα {} μπορούν επίσης να εμφανίζονται σε ξεχωριστές γραμμές:

>>> whale = {"name": "Blue Whale", 
             "speed": 35, 
             "land_animal": False}
{'name': 'Blue Whale', 'speed': 35, 'land_animal': False}

>>> wombat = {'name': 'Wombat',
              'speed': 23,
              'land_animal': True,
              'color': 'Brindle'}

>>> wombat
{'name': 'Wombat', 'speed': 23, 'land_animal': True, 'color': 'Brindle'}

Εμφωλευμένα Λεξικά

Τα λεξικά μπορούν να εμφωλευτούν αυθαίρετα:

animals = {
    "Real" : {
        "Winged" : {
            "Sparrow" : {'name': 'sparrow','speed': 12, 'land_animal': True},
            "Kestrel" : {'name': 'kestrel', 'speed': 15, 'land_animal': True}
           },
        "Legged" : {
            "Wombat" : {'name': 'Wombat', 'speed': 23, 'land_animal': True},
            "Black Bear": {'name': 'Black Bear', 'speed': 40, 'land_animal': True},
            "Polecat" : {'name': 'Polecat', 'speed': 15, 'land_animal': True}
           },
        "Other" :  {
            "Whale" : {'name': 'Blue Whale', 'speed': 35, 'land_animal': False},
            "Orca" : {'name': 'Orca', 'speed': 45, 'land_animal': False},
            "Snake" : {'name': 'Python', 'speed': 25, 'land_animal': True}
            }
        },
        
    "Imaginary": {
        "Winged" : {
            "Dragon" : {'name': 'Fire Dragon','speed': 100, 'land_animal': True},
            "Phoenix" : {'name': 'Phoenix', 'speed': 1500, 'land_animal': True}
            },
        "Legged" : {
            "Sphinx" : {'name': 'Sphinx','speed': 10, 'land_animal': True},
            "Minotaur" : {'name': 'Minotaur', 'speed': 5, 'land_animal': True}
            },
        "Other" :  {}
        }
   }

Πρόσβαση σε Τιμές σε ένα dict

Μπορείς να προσπελάσεις ένα value σε ένα λεξικό χρησιμοποιώντας ένα κλειδί μέσα σε αγκύλες. Αν ένα κλειδί δεν υπάρχει στο λεξικό, πετιέται ένα KeyError:

>>> bear["speed"]
40

>>> bear["color"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'color'

Η πρόσβαση σε μια καταχώριση μέσω της μεθόδου get(<key>, <default value>) μπορεί να αποφύγει το KeyError:

>>> bear.get("color", 'not found')
'not found'

Πρόσβαση σε Εμφωλευμένες Καταχωρίσεις Λεξικού

Για να προσπελάσεις καταχωρίσεις σε εμφωλευμένα λεξικά, χρησιμοποίησε διαδοχικές αγκύλες. Αν λείπει ένα δεδομένο κλειδί, θα πεταχτεί το συνηθισμένο KeyError:

# Using the animals nested dictionary.
>>> animals["Real"]["winged"]["Kestrel"]["speed"]
15

>>> animals["Imaginary"]["winged"]["Kestrel"]["speed"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Kestrel'

Για να αποφύγεις το KeyError, μπορεί να χρησιμοποιηθεί το .get(), αλλά οι κλήσεις στο .get() πρέπει να είναι αλυσιδωτές:

# Using the animals nested dictionary.
# Note the use of parenthesis to enable placing the 
# .get() calls on separate lines.
>>> (animals.get("Imaginary", {})
            .get("Legged", {})
            .get("Sphinx", {})
            .get("Color", "I have no idea!"))
'I have no idea!'

Αλλαγή ή Προσθήκη Τιμών σε ένα Λεξικό

Μπορείς να αλλάξεις την value μιας καταχώρισης αναθέτοντας στο κλειδί της:

# Assigning the value "Grizzly Bear" to the name key.
>>> bear["name"] = "Grizzly Bear"
{'name': 'Grizzly Bear', 'speed': 40, 'land_animal': True}

>>> whale["speed"] = 25
{'name': 'Blue Whale', 'speed': 25, 'land_animal': False}

Νέα ζεύγη key:value μπορούν να προστεθούν με τον ίδιο τρόπο:

# Adding a new "color" key with a new "tawney" value.
>>> bear["color"] = 'tawney'
{'name': 'Grizzly Bear', 'speed': 40, 'land_animal': True, 'color': 'tawney'}

>>> whale["blowholes"] = 1
{'name': 'Blue Whale', 'speed': 25, 'land_animal': False, 'blowholes': 1}

Αφαίρεση Καταχωρίσεων Λεξικού (Pop και del)

Μπορείς να χρησιμοποιήσεις τη μέθοδο <dict>.pop(<key>) για να διαγράψεις μια καταχώριση λεξικού. Το <dict>.pop() αφαιρεί το ζεύγος (key, value) και επιστρέφει το value για χρήση. Όπως το <dict>.get(), το <dict>.pop(<key>) δέχεται ένα δεύτερο όρισμα (<dict>.pop(<key>, <default value>)) που θα επιστραφεί αν το key δεν βρεθεί. Αυτό αποτρέπει να πεταχτεί ένα KeyError:

# Using .pop() removes both the key and value, returning the value.
>>> bear.pop("name")
'Grizzly Bear'


# The "name" key is now removed from the dictionary.
# Attempting .pop() a second time will throw a KeyError.
>>> bear.pop("name")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'name'


# Using a default argument with .pop() will 
# prevent a KeyError from a missing key.
>>> bear.pop("name", "Unknown")
'Unknown'

Μπορείς επίσης να χρησιμοποιήσεις την εντολή del για να αφαιρέσεις μία ή περισσότερες καταχωρίσεις. Ένα KeyError πετιέται αν η καταχώριση προς αφαίρεση δεν βρίσκεται στο λεξικό:

>>> wombat = {'name': 'Wombat',
              'speed': 23,
              'land_animal': True,
              'color': 'Brindle',
              'talent': 'Singing',
              'size': 'small'}

# Remove a single entry from the dictionary.
>>> del wombat["color"]
>>> wombat
{'name': 'Wombat', 'speed': 23, 'land_animal': True, 'talent': 'Singing', 'size': 'small'}


# Remove multiple entries from the dictionary.
>>> del wombat["talent"], wombat["size"]
>>> wombat
{'name': 'Wombat', 'speed': 23, 'land_animal': True}


# Attempting a deletion of a non-existent key raises a KeyError
>>> del wombat["number_of_legs"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'number_of_legs'

Επανάληψη σε ένα Λεξικό

Η διάσχιση ενός λεξικού με for item in dict ή while item θα επαναλάβει πάνω στα κλειδιά από προεπιλογή. Μπορείς να προσπελάσεις τις τιμές μέσα στον ίδιο βρόχο χρησιμοποιώντας αγκύλες:

>>> for key in bear:
...     print((key, bear[key])) # <--This prints a tuple of (key, value).
('name', 'Black Bear')
('speed', 40)
('land_animal', True)

Μπορείς επίσης να χρησιμοποιήσεις τη μέθοδο .items(), η οποία επιστρέφει πλειάδες (key, value):

# dict.items() forms (key, value tuples) that can be 
# unpacked and iterated over.
>>> for key, value in whale.items():
...     print(key, ":", value)
name : Blue Whale
speed : 25
land_animal : False
blowholes : 1

Παρομοίως, το .keys() θα επιστρέψει τα keys και το .values() θα επιστρέψει τα values.

Για μια λεπτομερή εξήγηση των λεξικών στην Python, η επίσημη τεκμηρίωση είναι ένα εξαιρετικό σημείο εκκίνησης, ή μπορείς επίσης να ρίξεις μια ματιά στο σεμινάριο του W3-Schools.

Επέκταση της Λειτουργικότητας του Λεξικού: Το Άρθρωμα Collections

Το άρθρωμα collections προσθέτει εξειδικευμένη λειτουργικότητα στους τυπικούς τύπους δεδομένων συλλογών της Python (dict, set, list, tuple). Τρεις από τις πιο χρήσιμες κλάσεις που βασίζονται σε λεξικά είναι:

  • Το Counter μετράει αυτόματα στοιχεία και τα επιστρέφει σε ένα dict με τα στοιχεία ως κλειδιά και τις μετρήσεις τους ως τιμές.
  • Το OrderedDict διαθέτει μεθόδους ειδικά σχεδιασμένες για τη διευθέτηση της σειράς των καταχωρίσεων ενός λεξικού.
  • Το defaultdict χρησιμοποιεί μια μέθοδο εργοστασίου για να ορίσει μια προεπιλεγμένη τιμή αν ένα key δεν βρεθεί όταν προσπαθείς να ανακτήσεις ή να αναθέσεις σε μια καταχώριση λεξικού.
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Λεξικά

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 4 ακόμη ασκήσεις για να εξασκηθείς στην έννοια Λεξικά