Dicționarele Python (obiecte de tip dict) nu păstrează ordinea elementelor; CPython a făcut acest lucru începând cu versiunea 3.6, dar este dependentă de implementare și nedefinită în alte implementări; specificația limbajului a păstrat ordinea începând cu versiunea 3.7.
OrderedDict este furnizat în modulul collections din biblioteca standard ca un dicționar care păstrează ordinea. Este sigur să îl utilizați pe acesta.
Importați modulul de colecții. Acesta este inclus în biblioteca standard și nu este necesar să fie instalat.
import collections
Dacă scrieți ceea ce urmează, puteți omite colecțiile. în următoarele exemple.
from collections import OrderedDict
În cele ce urmează este prezentată o descriere a modului de utilizare a OrderedDict.
- Crearea unui obiect OrderedDict
- OrderedDict este o subclasă de dict
- Mutarea elementelor la început sau la sfârșit
- Adăugați un nou element în orice poziție.
- Rearanjarea (reordonarea) elementelor
- Sortarea elementelor după cheie sau valoare
Crearea unui obiect OrderedDict
Constructorul collections.OrderedDict() poate fi utilizat pentru a crea un obiect OrderedDict.
Creați un obiect OrderedDict gol și adăugați valori.
od = collections.OrderedDict()
od['k1'] = 1
od['k2'] = 2
od['k3'] = 3
print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
De asemenea, este posibil să se specifice argumente pentru constructor.
Puteți utiliza argumente de tip cuvânt cheie, secvențe de perechi cheie-valoare (cum ar fi tuple (cheie, valoare)) și așa mai departe. Acesta din urmă poate fi o listă sau un tuple, atâta timp cât este o pereche cheie-valoare.
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)])
Până la versiunea 3.5, ordinea argumentelor cuvintelor cheie nu era păstrată, dar începând cu versiunea 3.6, aceasta este păstrată acum.
Modificat în versiunea 3.6: Odată cu acceptarea PEP 468, ordinea constructorului OrderedDict și a argumentelor de tip cuvânt cheie transmise metodei update() este păstrată.
collections — Container datatypes — Python 3.10.0 Documentation
Dicționarele normale (obiecte de tip dict) pot fi, de asemenea, transmise constructorului, dar în cazul implementărilor în care tipul dict nu păstrează ordinea, OrderedDict generat din acesta nu va păstra nici el ordinea.
print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
OrderedDict este o subclasă de dict
OrderedDict este o subclasă a dict.
print(issubclass(collections.OrderedDict, dict))
# True
OrderedDict are, de asemenea, aceleași metode ca și dict, iar metodele de obținere, modificare, adăugare și eliminare a elementelor sunt aceleași ca și 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)])
Pentru detalii, consultați următorul articol.
Mutarea elementelor la început sau la sfârșit
Puteți utiliza metoda proprie lui OrderedDict move_to_end() pentru a muta un element la început sau la sfârșit.
Specificați cheia ca prim argument. Valoarea implicită este de a se muta la sfârșit, dar dacă al doilea argument last este false, va fi mutat la început.
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)])
Adăugați un nou element în orice poziție.
Este posibil să se creeze un nou obiect OrderedDict cu un nou element adăugat într-o poziție arbitrară. În mod specific, acest lucru se poate face în următorul flux.
- Enumeră obiectele de vizualizare care pot fi obținute cu metoda items() folosind list().
- Adăugați un tuple (cheie, valoare) de perechi cheie-valoare în metoda insert() a listei
- Creați un nou obiect, trecându-l constructorului 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() specifică poziția care trebuie inserată ca prim argument, iar elementul care trebuie inserat ca al doilea argument.
În acest exemplu, un nou obiect este atribuit variabilei originale și nu se adaugă elemente noi la obiectul original.
Rearanjarea (reordonarea) elementelor
Înlocuirea elementelor este același proces ca în exemplul de mai sus.
- Enumeră obiectele de vizualizare care pot fi obținute cu metoda items() folosind list().
- Înlocuirea elementelor dintr-o listă
- Creați un nou obiect, trecându-l constructorului 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)])
Dacă doriți să specificați o cheie și să o înlocuiți, utilizați metoda index() pentru a obține indexul (poziția) din lista de chei, după cum se arată mai jos.
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)])
Sortarea elementelor după cheie sau valoare
Creați o listă de tuple (key, value) de perechi cheie-valoare sortate pe baza obiectului view care poate fi obținut prin metoda items() și treceți-o constructorului collections.OrderedDict() pentru a crea un nou obiect.
Sortarea se realizează prin specificarea unei funcții anonime (expresie lambda) care returnează o cheie sau o valoare dintr-un tuple (cheie, valoare) ca argument cheie al funcției încorporate sorted().
Dacă doriți să inversați ordinea, setați argumentul reverse din sorted() la 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)])