Πώς να χρησιμοποιήσετε το OrderedDict, ένα διατεταγμένο λεξικό της Python.

Επιχείρηση

Τα λεξικά της Python (αντικείμενα τύπου dict) δεν διατηρούν τη σειρά των στοιχείων- η CPython το κάνει από την έκδοση 3.6, αλλά αυτό εξαρτάται από την υλοποίηση και είναι αόριστο σε άλλες υλοποιήσεις- οι προδιαγραφές της γλώσσας διατηρούν τη σειρά από την έκδοση 3.7.

Το OrderedDict παρέχεται στην ενότητα collections της τυπικής βιβλιοθήκης ως ένα λεξικό που διατηρεί τη σειρά. Είναι ασφαλές να το χρησιμοποιήσετε.

Εισάγετε την ενότητα συλλογών. Περιλαμβάνεται στην τυπική βιβλιοθήκη και δεν χρειάζεται να εγκατασταθεί.

import collections

Αν γράψετε τα παρακάτω, μπορείτε να παραλείψετε τις συλλογές. στα ακόλουθα παραδείγματα.

from collections import OrderedDict

Ακολουθεί μια περιγραφή του τρόπου χρήσης του OrderedDict.

  • Δημιουργία ενός αντικειμένου OrderedDict
  • Η OrderedDict είναι υποκλάση της dict
  • Μετακίνηση στοιχείων στην αρχή ή στο τέλος
  • Προσθέστε ένα νέο στοιχείο σε οποιαδήποτε θέση.
  • Επανατοποθέτηση (αναδιάταξη) στοιχείων
  • Ταξινόμηση στοιχείων με βάση το κλειδί ή την τιμή

Δημιουργία ενός αντικειμένου OrderedDict

Ο κατασκευαστής collections.OrderedDict() μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός αντικειμένου OrderedDict.

Δημιουργήστε ένα κενό αντικείμενο OrderedDict και προσθέστε τιμές.

od = collections.OrderedDict()

od['k1'] = 1
od['k2'] = 2
od['k3'] = 3

print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

Είναι επίσης δυνατό να καθορίσετε ορίσματα στον κατασκευαστή.

Μπορείτε να χρησιμοποιήσετε ορίσματα με λέξεις-κλειδιά, ακολουθίες ζευγών κλειδιών-τιμών (όπως πλειάδες (κλειδί, τιμή)) κ.ο.κ. Το τελευταίο μπορεί να είναι μια λίστα ή μια πλειάδα, αρκεί να είναι ένα ζεύγος κλειδιού-τιμής.

print(collections.OrderedDict(k1=1, k2=2, k3=3))
print(collections.OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)]))
print(collections.OrderedDict((['k1', 1], ['k2', 2], ['k3', 3])))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

Μέχρι την έκδοση 3.5, η σειρά των ορίων των λέξεων-κλειδιών δεν διατηρούνταν, αλλά από την έκδοση 3.6 διατηρείται πλέον.

Αλλαγή στην έκδοση 3.6: Διατηρείται η σειρά του κατασκευαστή OrderedDict και τα ορίσματα με λέξεις-κλειδιά που περνούν στη μέθοδο update().
collections — Container datatypes — Python 3.10.0 Documentation

Κανονικά λεξικά (αντικείμενα τύπου dict) μπορούν επίσης να περάσουν στον κατασκευαστή, αλλά στην περίπτωση υλοποιήσεων όπου ο τύπος dict δεν διατηρεί τη σειρά, το OrderedDict που παράγεται από αυτό δεν θα διατηρεί επίσης τη σειρά.

print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

Η OrderedDict είναι υποκλάση της dict

Η OrderedDict είναι υποκλάση της dict.

print(issubclass(collections.OrderedDict, dict))
# True

Το OrderedDict έχει επίσης τις ίδιες μεθόδους με το dict, και οι μέθοδοι για τη λήψη, την αλλαγή, την προσθήκη και την αφαίρεση στοιχείων είναι οι ίδιες με το dict.

print(od['k1'])
# 1

od['k2'] = 200
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

od.update(k4=4, k5=5)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('k4', 4), ('k5', 5)])

del od['k4'], od['k5']
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

Δείτε το ακόλουθο άρθρο για λεπτομέρειες.

Μετακίνηση στοιχείων στην αρχή ή στο τέλος

Μπορείτε να χρησιμοποιήσετε τη μέθοδο move_to_end() του OrderedDict για να μετακινήσετε ένα στοιχείο στην αρχή ή στο τέλος.

Καθορίστε το κλειδί ως πρώτο όρισμα. Η προεπιλογή είναι η μετακίνηση στο τέλος, αλλά αν το δεύτερο όρισμα last είναι false, θα μετακινηθεί στην αρχή.

od.move_to_end('k1')
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1)])

od.move_to_end('k1', False)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

Προσθέστε ένα νέο στοιχείο σε οποιαδήποτε θέση.

Είναι δυνατή η δημιουργία ενός νέου αντικειμένου OrderedDict με ένα νέο στοιχείο που προστίθεται σε μια αυθαίρετη θέση. Συγκεκριμένα, αυτό μπορεί να γίνει με την ακόλουθη ροή.

  1. Λίστα των αντικειμένων προβολής που μπορούν να ληφθούν με τη μέθοδο items() χρησιμοποιώντας τη μέθοδο list().
  2. Προσθήκη μιας πλειάδας (κλειδί, τιμή) από ζεύγη κλειδιών-τιμών στη μέθοδο insert() της λίστας
  3. Δημιουργήστε ένα νέο αντικείμενο περνώντας το στον κατασκευαστή collections.OrderedDict()
l = list(od.items())
print(l)
# [('k1', 1), ('k2', 200), ('k3', 3)]

l.insert(1, ('kx', -1))
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)])

Η insert() καθορίζει τη θέση που πρέπει να εισαχθεί ως πρώτο όρισμα και το στοιχείο που πρέπει να εισαχθεί ως δεύτερο όρισμα.

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

Επανατοποθέτηση (αναδιάταξη) στοιχείων

Η αντικατάσταση στοιχείων είναι η ίδια διαδικασία όπως στο παραπάνω παράδειγμα.

  1. Λίστα των αντικειμένων προβολής που μπορούν να ληφθούν με τη μέθοδο items() χρησιμοποιώντας τη μέθοδο list().
  2. Αντικατάσταση στοιχείων σε μια λίστα
  3. Δημιουργήστε ένα νέο αντικείμενο περνώντας το στον κατασκευαστή collections.OrderedDict()
l = list(od.items())
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

l[0], l[2] = l[2], l[0]
print(l)
# [('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)])

Αν θέλετε να καθορίσετε ένα κλειδί και να το αντικαταστήσετε, χρησιμοποιήστε τη μέθοδο index() για να λάβετε το δείκτη (θέση) από τη λίστα των κλειδιών, όπως φαίνεται παρακάτω.

l = list(od.items())
k = list(od.keys())
print(k)
# ['k2', 'kx', 'k1', 'k3']

print(k.index('kx'))
# 1

l[k.index('kx')], l[k.index('k3')] = l[k.index('k3')], l[k.index('kx')]
print(l)
# [('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

Ταξινόμηση στοιχείων με βάση το κλειδί ή την τιμή

Δημιουργήστε μια λίστα από πλειάδες (key, value) ταξινομημένων ζευγών κλειδιού-τιμής με βάση το αντικείμενο προβολής που μπορεί να ληφθεί από τη μέθοδο items() και περάστε την στον κατασκευαστή collections.OrderedDict() για να δημιουργήσετε ένα νέο αντικείμενο.

Η ταξινόμηση πραγματοποιείται καθορίζοντας μια ανώνυμη συνάρτηση (έκφραση λάμδα) που επιστρέφει ένα κλειδί ή μια τιμή από μια πλειάδα (κλειδί, τιμή) ως όρισμα κλειδί της ενσωματωμένης συνάρτησης sorted().

Αν θέλετε να αντιστρέψετε τη σειρά, ορίστε το αντίστροφο όρισμα της sorted() σε true.

print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

od_sorted_key = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[0])
)
print(od_sorted_key)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('kx', -1)])

od_sorted_value = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[1], reverse=True)
)
print(od_sorted_value)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])