Η κλάση dict στην Python παρέχει πολλές χρήσιμες μεθόδους για την εργασία με λεξικά.
Κάποιες παρουσιάστηκαν στην ενότητα για τα dict.
Εδώ καλύπτουμε μερικές ακόμα, μαζί με κάποιες τεχνικές για τη διάσχιση και τον χειρισμό λεξικών.
<dict>.setdefault() προσθέτει κλειδιά αυτόματα, χωρίς να πετάει KeyError.<dict>.fromkeys(<iterable>, <default value>) δημιουργεί ένα νέο dict από οποιοδήποτε πλήθος iterables.<dict>.keys(), <dict>.values() και <dict>.items() παρέχουν βολικούς iterators.sorted(<dict>.items()) μπορεί εύκολα να αναδιατάξει τις καταχωρήσεις σε ένα dict.<dict_one>.update(<dict_two>) ενημερώνει ένα dict με τις επικαλυπτόμενες τιμές από ένα άλλο dict.<dict> | <other_dict> και <dict> |= <other_dict> συγχωνεύουν ή ενημερώνουν δύο dict μέσω τελεστών.reversed(<dict>.keys()), reversed(<dict>.values()) ή reversed(<dict>.items()) παράγουν ανεστραμμένες προβολές.<dict>.popitem() αφαιρεί και επιστρέφει ένα ζεύγος key, value.setdefault() για εισαγωγή χωρίς σφάλματαΗ ενότητα για τα λεξικά κάλυψε προηγουμένως ότι η <dict>.get(<key>, <default value>) επιστρέφει μια υπάρχουσα value ή την default value αν ένα key δεν βρεθεί σε ένα λεξικό, αποφεύγοντας έτσι ένα KeyError.
Αυτό λειτουργεί καλά σε καταστάσεις όπου θα προτιμούσες να μην έχεις επιπλέον χειρισμό σφαλμάτων, αλλά δεν μπορείς να είσαι σίγουρος ότι ένα key που ψάχνεις θα υπάρχει.
Για μια εξίσου "ασφαλή" (χωρίς KeyError) λειτουργία εισαγωγής, υπάρχει η μέθοδος <dict>.setdefault(<key>, <default value>).
Η <dict>.setdefault(<key>, <default value>) θα επιστρέψει την value αν το key βρεθεί στο λεξικό.
Αν το κλειδί δεν βρεθεί, θα εισάγει το ζεύγος (key, default value) και θα επιστρέψει την default value για χρήση.
>>> palette_I = {'Grassy Green': '#9bc400', 'Purple Mountains Majesty': '#8076a3', 'Misty Mountain Pink': '#f9c5bd'}
# Looking for the value associated with key "Rock Brown".The key does not exist,
# so it is added with the default value, and the value is returned.
>>> palette.setdefault('Rock Brown', '#694605')
'#694605'
# The (key, default value) pair has now been added to the dictionary.
>>> palette_I
{'Grassy Green': '#9bc400', 'Purple Mountains Majesty': '#8076a3', 'Misty Mountain Pink': '#f9c5bd', 'Rock Brown': '#694605'}
fromkeys() για να γεμίσεις ένα λεξικό από ένα iterableΓια να γεμίσεις γρήγορα ένα λεξικό με διάφορα keys και προεπιλεγμένες τιμές, η μέθοδος κλάσης fromkeys(<iterable>, <default value>) θα διατρέξει ένα iterable από keys και θα δημιουργήσει ένα νέο dict.
Όλα τα values θα οριστούν στην default value που δίνεις:
>>> new_dict = dict.fromkeys(['Grassy Green', 'Purple Mountains Majesty', 'Misty Mountain Pink'], 'fill in hex color here')
{'Grassy Green': 'fill in hex color here',
'Purple Mountains Majesty': 'fill in hex color here',
'Misty Mountain Pink': 'fill in hex color here'}
.popitem()
Η .popitem() αφαιρεί και επιστρέφει ένα μόνο ζεύγος (key, value) από ένα λεξικό.
Τα ζεύγη επιστρέφονται με σειρά Τελευταίο μέσα, Πρώτο έξω (LIFO).
Αν το λεξικό είναι άδειο, η κλήση της popitem() θα πετάξει ένα KeyError:
>>> palette_I = {'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd'}
>>> palette_I.popitem()
('Misty Mountain Pink', '#f9c5bd')
>>> palette_I.popitem()
('Purple Mountains Majesty', '#8076a3')
>>> palette_I.popitem()
('Grassy Green', '#9bc400')
# All (key, value) pairs have been removed.
>>> palette_I.popitem()
Traceback (most recent call last):
line 1, in <module>
palette_I.popitem()
KeyError: 'popitem(): dictionary is empty'
Οι μέθοδοι .keys(), .values() και .items() επιστρέφουν iterable προβολές ενός λεξικού.
Αυτές οι προβολές μπορούν να χρησιμοποιηθούν για να διατρέξεις εύκολα τις καταχωρήσεις χωρίς να τις αλλάξεις.
Οι προβολές είναι επίσης δυναμικές. Όταν αλλάζουν τα δεδομένα του υποκείμενου λεξικού, το σχετικό view object αντικατοπτρίζει την αλλαγή:
>>> palette_I = {'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd'}
# Using .keys() returns a list of keys.
>>> palette_I.keys()
dict_keys(['Grassy Green', 'Purple Mountains Majesty', 'Misty Mountain Pink'])
# Using .values() returns a list of values.
>>> palette_I.values()
dict_values(['#9bc400', '#8076a3', '#f9c5bd'])
# Using .items() returns a list of (key, value) tuples.
>>> palette_I.items()
dict_items([('Grassy Green', '#9bc400'), ('Purple Mountains Majesty', '#8076a3'), ('Misty Mountain Pink', '#f9c5bd')])
# Views are dynamic. Changing values in the dict
# changes all of the associated views.
>>> palette_I['Purple Mountains Majesty'] = (128, 118, 163)
>>> palette_I['Deep Red'] = '#932432'
>>> palette_I.values()
dict_values(['#9bc400', (128, 118, 163), '#f9c5bd', '#932432'])
>>> palette_I.keys()
dict_keys(['Grassy Green', 'Purple Mountains Majesty', 'Misty Mountain Pink', 'Deep Red'])
>>> palette_I.items()
dict_items([('Grassy Green', '#9bc400'), ('Purple Mountains Majesty', (128, 118, 163)), ('Misty Mountain Pink', '#f9c5bd'), ('Deep Red', '#932432')])
.keys(), .values() και .items()
Στην Python 3.7+, τα dicts διατηρούν τη σειρά με την οποία εισάγονται οι καταχωρήσεις, επιτρέποντας επανάληψη Πρώτο μέσα, Πρώτο έξω (FIFO) όταν χρησιμοποιείς τις .keys(), .values() ή .items().
Στην Python 3.8+, οι προβολές είναι επίσης αντιστρέψιμες.
Αυτό επιτρέπει την επανάληψη κλειδιών, τιμών ή ζευγών (key, value) με σειρά Τελευταίο μέσα, Πρώτο έξω (LIFO), χρησιμοποιώντας τις reversed(<dict>.keys()), reversed(<dict>.values()) ή reversed(<dict>.items()):
>>> palette_II = {'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
>>> for item in palette_II.items():
... print(item)
...
('Factory Stone Purple', '#7c677f')
('Green Treeline', '#478559')
('Purple baseline', '#161748')
>>> for item in reversed(palette_II.items()):
... print(item)
...
('Purple baseline', '#161748')
('Green Treeline', '#478559')
('Factory Stone Purple', '#7c677f')
.update()
Η <dict_one>.update(<dict_two>) μπορεί να χρησιμοποιηθεί για να συνδυάσεις δύο λεξικά.
Αυτή η μέθοδος παίρνει τα ζεύγη (key,value) του <dict_two> και τα γράφει στο <dict_one>:
>>> palette_I = {'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd'}
>>> palette_II = {'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple Baseline': '#161748'}
>>> palette_I.update(palette_II)
# Note that new items from palette_II are added.
>>> palette_I
{'Grassy Green': '#9bc400', 'Purple Mountains Majesty': '#8076a3', 'Misty Mountain Pink': '#f9c5bd', 'Factory Stone Purple': '#7c677f', 'Green Treeline': '#478559', 'Purple Baseline': '#161748'}
Όπου τα κλειδιά στα δύο λεξικά επικαλύπτονται, η value στο dict_one αντικαθίσταται από την αντίστοιχη value του dict_two:
>>> palette_I = {'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd',
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
>>> palette_III = {'Grassy Green': (155, 196, 0),
'Purple Mountains Majesty': (128, 118, 163),
'Misty Mountain Pink': (249, 197, 189)}
>>> palette_I.update(palette_III)
# Overlapping values in palette_I are replaced with
# values from palette_III
>>> palette_I
{'Grassy Green': (155, 196, 0),
'Purple Mountains Majesty': (128, 118, 163),
'Misty Mountain Pink': (249, 197, 189),
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559', 'Purple baseline': '#161748'}
| και |=)Η Python 3.9 εισάγει έναν διαφορετικό τρόπο συγχώνευσης dicts: τους τελεστές union.
Το dict_one | dict_two θα δημιουργήσει ένα νέο λεξικό, που αποτελείται από τα ζεύγη (key, value) των dict_one και dict_two.
Όταν τα δύο λεξικά μοιράζονται κλειδιά, οι τιμές του dict_two υπερισχύουν.
>>> palette_I = {'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd'}
>>> palette_II = {'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
>>> new_dict = palette_I | palette_II
>>> new_dict
...
{'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd',
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
Το dict_one |= other συμπεριφέρεται παρόμοια με το <dict_one>.update(<other>), αλλά σε αυτή την περίπτωση το other μπορεί να είναι είτε ένα dict είτε ένα iterable από ζεύγη (key, value):
>>> palette_III = {'Grassy Green': (155, 196, 0),
'Purple Mountains Majesty': (128, 118, 163),
'Misty Mountain Pink': (249, 197, 189)}
>>> new_dict |= palette_III
>>> new_dict
...
{'Grassy Green': (155, 196, 0),
'Purple Mountains Majesty': (128, 118, 163),
'Misty Mountain Pink': (249, 197, 189),
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
Τα λεξικά δεν έχουν ενσωματωμένη μέθοδο ταξινόμησης.
Ωστόσο, μπορείς να ταξινομήσεις μια προβολή ενός dict χρησιμοποιώντας την ενσωματωμένη συνάρτηση sorted() μαζί με την .items().
Η ταξινομημένη προβολή μπορεί στη συνέχεια να χρησιμοποιηθεί για να δημιουργήσεις ένα νέο λεξικό.
Αν δεν οριστεί ένα κλειδί ταξινόμησης, η προεπιλεγμένη ταξινόμηση γίνεται με βάση τα keys του λεξικού.
# Default ordering for a dictionary is last in, first out (LIFO).
>>> color_palette = {'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd',
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
# The default sort order for a dictionary uses the keys.
>>> sorted_palette = dict(sorted(color_palette.items()))
>>> sorted_palette
{'Factory Stone Purple': '#7c677f',
'Grassy Green': '#9bc400',
'Green Treeline': '#478559',
'Misty Mountain Pink': '#f9c5bd',
'Purple Mountains Majesty': '#8076a3',
'Purple baseline': '#161748'}
# A sort key can be provided in the form
# of an anonymous function (lambda).
>>> value_sorted_palette = dict(sorted(color_palette.items(), key=lambda color: color[1]))
>>> value_sorted_palette
{'Purple baseline': '#161748',
'Green Treeline': '#478559',
'Factory Stone Purple': '#7c677f',
'Purple Mountains Majesty': '#8076a3',
'Grassy Green': '#9bc400',
'Misty Mountain Pink': '#f9c5bd'}
Η αξιόπιστη ανταλλαγή κλειδιών και τιμών σε ένα λεξικό απαιτεί λίγη δουλειά, αλλά μπορεί να γίνει με έναν loop χρησιμοποιώντας το dict.items() ή με ένα dictionary comprehension.
Η ασφαλής ανταλλαγή προϋποθέτει ότι τα κλειδιά και οι τιμές του dict είναι και τα δύο hashable.
color_reference = {'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd',
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
# Creating a new dictionary to hold the swapped entries.
>>> swapped_color_reference = {}
# Iterating through the dictionary, using values as keys.
>>> for key, value in color_reference.items():
... swapped_color_reference[value] = key
>>> swapped_color_reference
{'#8076a3': 'Purple Mountains Majesty',
'#f9c5bd': 'Misty Mountain Pink',
'#7c677f': 'Factory Stone Purple',
'#478559': 'Green Treeline',
'#161748': 'Purple baseline'}
# A dictionary comprehension can also be used to swap entries.
>>> swapped = {value: key for key, value in
color_reference.items()}
>>> swapped
{'#8076a3': 'Purple Mountains Majesty',
'#f9c5bd': 'Misty Mountain Pink',
'#7c677f': 'Factory Stone Purple',
'#478559': 'Green Treeline',
'#161748': 'Purple baseline'}
Αν οι τιμές που είναι αποθηκευμένες στο dict δεν είναι μοναδικές, χρειάζονται επιπλέον έλεγχοι πριν γίνει η ανταλλαγή κλειδιών και τιμών:
# Things become more complicated if there are duplicates in
# potential key values.This dict is arranged by hex, RGB, and HSL
# keys, but values repeat.
>>> extended_colors = {'#8076a3': 'Purple Mountains Majesty',
(128, 118, 163): 'Purple Mountains Majesty',
(21, 28, 0, 36): 'Purple Mountains Majesty',
'#f9c5bd': 'Misty Mountain Pink',
(249, 197, 189): 'Misty Mountain Pink',
(0, 21, 24, 2): 'Misty Mountain Pink',
'#7c677f': 'Factory Stone Purple',
(124, 103, 127): 'Factory Stone Purple',
(2, 19, 0, 50): 'Factory Stone Purple',
'#478559': 'Green Treeline',
(71, 133, 89): 'Green Treeline',
(47, 0, 33, 48): 'Green Treeline'}
# New empty dictionary for holding swapped entries.
>>> consolidated_colors = {}
# Iterating over (key, value) pairs using .items()
>>> for key, value in extended_color_reference.items():
... if value in consolidated_colors: # <--Check if key has already been created.
... consolidated_colors[value].append(key)
... else:
... consolidated_colors[value] = [key] # <--Create a value list with the former key in it.
>>> consolidated_colors
{'Purple Mountains Majesty': ['#8076a3', (128, 118, 163), (21, 28, 0, 36)],
'Misty Mountain Pink': ['#f9c5bd', (249, 197, 189), (0, 21, 24, 2)],
'Factory Stone Purple': ['#7c677f', (124, 103, 127), (2, 19, 0, 50)],
'Green Treeline': ['#478559', (71, 133, 89), (47, 0, 33, 48)]}
Για μια λεπτομερή εξήγηση των λεξικών και των μεθόδων για την εργασία μαζί τους, το επίσημο σεμινάριο και η επίσημη αναφορά της βιβλιοθήκης είναι εξαιρετικά σημεία εκκίνησης.
Το Real Python και το Finxter έχουν επίσης πολύ αναλυτικά άρθρα για τα λεξικά της Python.
Για περισσότερα σχετικά με την ταξινόμηση, δες το Sorting HOW TO στην τεκμηρίωση της Python.