Με τις δομές δεδομένων αποθηκεύουμε δεδομένα που είναι «σχετικά» μεταξύ τους, όπως είναι οι λίστες και οι πλειάδες. Σε αυτή την ενότητα θα δούμε τις υπόλοιπες δομές δεδομένων, τα λεξικά και τα σύνολα.
Το λεξικό είναι μια δομή δεδομένων που αποτελείται από ζεύγη της μορφής κλειδί (keys) – τιμή (values). Τα κλειδιά είναι μοναδικά και σε καθένα από αυτά αντιστοιχεί και από μια τιμή. Το κλειδί χωρίζεται από την τιμή του με το σύμβολο της άνω και κάτω τελείας.
Τα στοιχεία ενός λεξικού δεν έχουν συγκεκριμένη σειρά και η αναφορά σε ένα στοιχείο γίνεται μέσω του κλειδιού. Για κλειδιά ενός λεξικού μπορούμε να χρησιμοποιήσουμε αμετάβλητα αντικείμενα όπως αριθμούς, συμβολοσειρές, πλειάδες, ενώ για τις τιμές μπορεί να είναι οποιαδήποτε τύπος δεδομένων.
Ένα λεξικό δεν είναι αμετάβλητο που σημαίνει ότι μπορούμε να προσθέσουμε ή να διαγράφουμε στοιχεία. Τα στοιχεία ενός λεξικού αποτελούνται από ζεύγη κλειδιών – τιμών τα οποία δεν ταξινομούνται, δηλαδή δεν υπάρχει η έννοια της θέσης με δείκτη και έτσι δεν μπορούμε να κάνουμε διάσχιση ή διαμέριση με δείκτη. Επειδή τα στοιχεία ενός λεξικού (ζεύγη κλειδιού – τιμής) δεν μπορούν να ταξινομηθούν, η αναφορά σε κάποιο στοιχείο γίνεται μέσω του κλειδιού.
Ένα άδειο λεξικό δημιουργείται με ένα ζευγάρι κενών αγκίστρων.
>>> mydict = {}
Για να προσθέσουμε ζευγάρια δεδομένων στο λεξικό χρησιμοποιούμε το όνομα του λεξικού και τετράγωνες αγκύλες ως εξής:
>>> mydict['Nikos']='nikos@mail.com'
>>> mydict['Kostas']='kostas@mail.com'
Σε αυτά τα παραδείγματα π.χ. η συμβολοσειρά ‘Nikos’ αποτελεί το κλειδί και η συμβολοσειρά ‘nikos@mail.com’ αποτελεί τη συσχετισμένη τιμή του. Όταν ένα κλειδί είναι συμβολοσειρά το περικλείουμε σε εισαγωγικά έτσι ώστε να μην δημιουργηθεί σύγχυση με τυχόντα ονόματα μεταβλητών. Επίσης, μπορούμε να επιλέξουμε οποιαδήποτε σειρά καταχώρησης στοιχείων σε ένα λεξικό.
Επειδή δεν ορίζεται αριθμητική δεικτοδότηση χρησιμοποιούμε το κλειδί για τον εντοπισμό της τιμής.
>>> mydict['Nikos']
'nikos@mail.com'
Όταν θέλουμε να αλλάξουμε την τιμή ενός στοιχείου χρησιμοποιούμε τον τελεστή ανάθεσης. Αν το κλειδί υπάρχει θα ενημερωθεί με την νέα τιμή. Αν δεν υπάρχει θα γίνει εισαγωγή νέου ζεύγους. Όταν χρησιμοποιήσουμε ανύπαρκτο κλειδί για να πάρουμε την τιμή του στοιχείου, θα πάρουμε μήνυμα λάθους:
>>> mydict['Antonios']
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
mydict['Antonios']
KeyError: 'Antonios'
Υπάρχει και ένας άλλος τρόπος για να δημιουργήσουμε ένα λεξικό, με το να βάλουμε τα στοιχεία του σε αγκύλες και να χρησιμοποιήσουμε την άνω και κάτω τελεία για το διαχωρισμό των κλειδιών και των τιμών, με κόμμα μεταξύ των στοιχείων, όπως φαίνεται στο ακόλουθο παράδειγμα:
>>> cities={'Athens':10000, 'Patra':5000, 'Kavala':1200}
Για την δημιουργία ενός λεξικού μπορούμε να χρησιμοποιήσουμε τον κατασκευαστή κλάσης από μια ακολουθία ζευγών κλειδιού – τιμής
>>>ages=dict([('Nikos', 25), ('Kostas', 32), ('Antonios', 22)])
>>>ages
{'Nikos': 25, 'Kostas': 32, 'Antonios': 22}
Η λειτουργία «υπολογιζόμενα» λεξικά εφαρμόζεται με την ίδια σύνταξη με αυτή των «υπολογιζόμενων» λιστών. Π.χ.
>>> powerof2={x:2**x for x in range(0,10)}
>>> powerof2
{0: 1, 1: 2, 2: 4, 3: 8, 4: 16, 5: 32, 6: 64, 7: 128, 8: 256, 9: 512}
Όταν η συνάρτηση len() εφαρμοστεί σε ένα λεξικό, επιστρέφει το πλήθος των στοιχείων του, δηλαδή το πλήθος των ζευγών κλειδί – τιμή Π.χ.
>>> cities={'Athens':10000, 'Patra':5000, 'Kavala':1200}
>>> len(cities)
3
Με την εντολή del διαγράφουμε ένα στοιχείο του λεξικού. Προσοχή: η εντολή del με όρισμα το όνομα του λεξικού, διαγράφει όλο το λεξικό από την μνήμη. Π.χ.
>>> del cities['Athens']
>>> cities
{'Patra': 5000, 'Kavala': 1200}
Μέθοδοι πάνω σε λεξικά
Η μέθοδος d.get(key, value) επιστρέφει την τιμή του στοιχείου με κλειδί το key. Αν το κλειδί δεν υπάρχει επιστρέφει την τιμή value. Π.χ.
>>> cities={'Athens':10000, 'Patra':5000, 'Kavala':1200}
>>> cities.get('Athens')
10000
>>> cities.get('Larisa', 'Not exist')
'Not exist'
Η μέθοδος d.update({key: value}) προσθέτει στο λεξικό d το στοιχείο key – value. Π.χ.
>>> cities={'Athens':10000, 'Patra':5000, 'Kavala':1200}
>>> cities.update({'Drama':2500})
>>> cities
{'Athens': 10000, 'Patra': 5000, 'Kavala': 1200, 'Drama': 2500}
Η μέθοδος d.keys() επιστρέφει μια λίστα με τα ονόματα των κλειδιών και με ένα βρόγχο for προσπελαύνουμε τα επιμέρους στοιχεία του λεξικού. Π.χ.
>>> cities={'Athens':10000, 'Patra':5000, 'Kavala':1200}
>>> for key in cities.keys():
… print(key, '--', cities[key])
…
Athens – 10000
Patra – 5000
Kavala -- 1200
Αντίστοιχα, η μέθοδος d.values() επιστρέφει μια λίστα με όλες τις τιμές των στοιχείων του λεξικού.
Η μέθοδος d.items() επιστρέφει μια λίστα με πλειάδες ζευγών (κλειδί, τιμή)
>>> cities={'Athens':10000, 'Patra':5000, 'Kavala':1200}
>>> for k, v in cities.items():
… print(k, v)
…
Athens 10000
Patra 5000
Kavala 1200
Ο τελεστής in
Μπορούμε να ελέγξουμε εάν ένα αντικείμενο είναι στοιχείο ενός λεξικού, χρησιμοποιόντας τον τελεστή in ο οποίος αναζητά το όρισμα μόνο στα κλειδιά του λεξικού.
>>> cities={'Athens':10000, 'Patra':5000, 'Kavala':1200}
>>> 'Athens' in cities
True
>>> 'Larisa' in cities
False
Για να ελέγξουμε εάν ένα αντικείμενο εμφανίζεται ως τιμή σε ένα λεξικό, χρησιμοποιούμε τη μέθοδο d.values(), η οποία δίνει μια λίστα με το σύνολο των τιμών του λεξικού και στη συνέχεια κάνουμε χρήση του τελεστή in
>>> cities={'Athens':10000, 'Patra':5000, 'Kavala':1200}
>>> val = cities.values()
>>> 5000 in val
True
>>> 2000 in val
False
Αντιγραφή λεξικού: Μπορούμε να αντιγράψουμε ένα λεξικό χρησιμοποιώντας την εντολή ανάθεσης «=» Με αυτό τον τρόπο δημιουργούμε ένα δεύτερο όνομα λεξικού το οποίο «δείχνει» στο ίδιο αντικείμενο με το πρώτο. Δηλαδή όταν κάνουμε μια αλλαγή σε ένα από τα δυο λεξικά, θα εμφανιστεί και στο άλλο λεξικό.
>>> cities={'Athens':10000, 'Patra':5000, 'Kavala':1200}
>>> mycities = cities
>>> mycities['Patra']=8000
>>> cities
{'Athens': 10000, 'Patra': 8000, 'Kavala': 1200}
>>> mycities
{'Athens': 10000, 'Patra': 8000, 'Kavala': 1200}
Μπορούμε να αντιγράψουμε ένα λεξικό χρησιμοποιώντας την μέθοδο d.copy(). Έτσι δημιουργείται ένα καινούργιο λεξικό, όπου όταν κάνουμε μια αλλαγή σε αυτό, δεν εμφανίζεται στο άλλο λεξικό.
>>> cities={'Athens':10000, 'Patra':5000, 'Kavala':1200}
>>> bigcities=cities.copy()
>>> bigcities
{'Athens': 10000, 'Patra': 5000, 'Kavala': 1200}
>>> bigcities['Kavala']=200
>>> cities
{'Athens': 10000, 'Patra': 5000, 'Kavala': 1200}
>>> cities['Athens']=15000
>>> bigcities
{'Athens': 10000, 'Patra': 5000, 'Kavala': 200}
>>> cities
{'Athens': 15000, 'Patra': 5000, 'Kavala': 1200}
Η μέθοδος d.clear() διαγράφει όλα τα στοιχεία του λεξικού d και επιστρέφει ένα κενό λεξικό.
>>> cities={'Athens':10000, 'Patra':5000, 'Kavala':1200}
>>> cities.clear()
>>> cities
{}
Η μέθοδος d.pop(key, value) διαγράφει το στοιχείο με κλειδί το key και επιστρέφει την τιμή του στοιχείου. Αν το κλειδί δεν υπάρχει, επιστρέφει την τιμή value Π.χ.
>>> cities={'Athens':10000, 'Patra':5000, 'Kavala':1200}
>>> cities.pop('Athens')
10000
>>> cities
{'Patra': 5000, 'Kavala': 1200}
>>> cities.pop('Larisa', 'Not exist')
'Not exist'
>>> cities
{'Patra': 5000, 'Kavala': 1200}
Η μέθοδος d.setdefault(key, value) επιστρέφει την τιμή του στοιχείου με κλειδί key. Αν το κλειδί δεν υπάρχει προσθέτει στο λεξικό το στοιχείο key – value και επιστρέφει την τιμή value. Π.χ.
>>> cities={'Athens':10000, 'Patra':5000, 'Kavala':1200}
>>> cities.setdefault('Patra')
5000
>>> cities.setdefault('Trikala', 3000)
3000
>>> cities
{'Athens': 10000, 'Patra': 5000, 'Kavala': 1200, 'Trikala': 3000}