Slovníky jazyka Python (objekty typu dict) nezachovávajú poradie prvkov; CPython tak robí od verzie 3.6, ale v iných implementáciách je to závislé od implementácie a neurčité; špecifikácia jazyka zachováva poradie od verzie 3.7.
OrderedDict je k dispozícii v module kolekcií štandardnej knižnice ako slovník, ktorý zachováva poradie. Je bezpečné ho používať.
Import modulu kolekcií. Je súčasťou štandardnej knižnice a nie je potrebné ho inštalovať.
import collections
Ak napíšete nasledujúci text, môžete vynechať kolekcie. v nasledujúcich príkladoch.
from collections import OrderedDict
Nasleduje opis používania OrderedDict.
- Vytvorenie objektu OrderedDict
- OrderedDict je podtrieda triedy dict
- Presun prvkov na začiatok alebo koniec
- Pridanie nového prvku na ľubovoľnú pozíciu.
- Zmeniť usporiadanie (zmenu poradia) prvkov
- Triedenie prvkov podľa kľúča alebo hodnoty
Vytvorenie objektu OrderedDict
Konštruktor collections.OrderedDict() možno použiť na vytvorenie objektu OrderedDict.
Vytvorenie prázdneho objektu OrderedDict a pridanie hodnôt.
od = collections.OrderedDict()
od['k1'] = 1
od['k2'] = 2
od['k3'] = 3
print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
Konštruktérovi je možné zadať aj argumenty.
Môžete použiť argumenty kľúčových slov, sekvencie dvojíc kľúč-hodnota (napríklad tuply (kľúč, hodnota)) atď. Posledným menovaným môže byť zoznam alebo tuple, pokiaľ ide o dvojicu kľúč-hodnota.
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)])
Do verzie 3.5 sa poradie argumentov kľúčových slov nezachovávalo, ale od verzie 3.6 sa už zachováva.
Zmenené vo verzii 3.6: S prijatím PEP 468 sa zachováva poradie konštruktora OrderedDict a argumentov kľúčových slov odovzdávaných metóde update().
collections — Container datatypes — Python 3.10.0 Documentation
Konštruktérovi možno odovzdať aj bežné slovníky (objekty typu dict), ale v prípade implementácií, v ktorých typ dict nezachováva poradie, z neho vygenerovaný OrderedDict tiež nezachová poradie.
print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
OrderedDict je podtrieda triedy dict
OrderedDict je podtrieda triedy dict.
print(issubclass(collections.OrderedDict, dict))
# True
OrderedDict má tiež rovnaké metódy ako dict a metódy na získanie, zmenu, pridanie a odstránenie prvkov sú rovnaké ako v prípade 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)])
Podrobnosti nájdete v nasledujúcom článku.
- Súvisiace články:Pridávanie prvkov do slovníka a spájanie slovníkov v jazyku Python
Presun prvkov na začiatok alebo koniec
Na presun prvku na začiatok alebo na koniec môžete použiť vlastnú metódu OrderedDict move_to_end().
Ako prvý argument zadajte kľúč. Predvolene sa presunie na koniec, ale ak je druhý argument false, presunie sa na začiatok.
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)])
Pridanie nového prvku na ľubovoľnú pozíciu.
Je možné vytvoriť nový objekt OrderedDict s novým prvkom pridaným na ľubovoľnú pozíciu. Konkrétne to možno vykonať nasledujúcim postupom.
- Zoznam objektov zobrazenia, ktoré možno získať pomocou metódy items() pomocou metódy list().
- Pridanie tuplu (kľúč, hodnota) dvojíc kľúč-hodnota v metóde insert() zoznamu
- Vytvorenie nového objektu odovzdaním konštruktoru 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)])
Funkcia insert() špecifikuje ako prvý argument pozíciu, ktorá sa má vložiť, a ako druhý argument prvok, ktorý sa má vložiť.
V tomto príklade je pôvodnej premennej priradený nový objekt a do pôvodného objektu nie sú pridané žiadne nové prvky.
Zmeniť usporiadanie (zmenu poradia) prvkov
Výmena prvkov je rovnaký postup ako vo vyššie uvedenom príklade.
- Zoznam objektov zobrazenia, ktoré možno získať pomocou metódy items() pomocou metódy list().
- Nahradiť prvky v zozname
- Vytvorenie nového objektu odovzdaním konštruktoru 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)])
Ak chcete určiť kľúč a nahradiť ho, použite metódu index() na získanie indexu (pozície) zo zoznamu kľúčov, ako je uvedené nižšie.
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)])
Triedenie prvkov podľa kľúča alebo hodnoty
Vytvorenie zoznamu tuplov (kľúč, hodnota) zoradených dvojíc kľúč-hodnota na základe objektu pohľadu, ktorý možno získať metódou items(), a jeho odovzdanie konštruktorovi collections.OrderedDict() na vytvorenie nového objektu.
Triedenie sa vykonáva zadaním anonymnej funkcie (lambda výrazu), ktorá vracia kľúč alebo hodnotu z tuplu (kľúč, hodnota) ako argumentu key vstavanej funkcie sorted().
Ak chcete zmeniť poradie, nastavte argument reverse funkcie sorted() na hodnotu 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)])