A Python szótárak (dict típusú objektumok) nem őrzik meg az elemek sorrendjét; a CPython a 3.6 óta teszi ezt, de más implementációkban ez implementációfüggő és bizonytalan; a nyelvi specifikáció a 3.7 óta őrzi meg a sorrendet.
Az OrderedDict a szabványos könyvtár collections moduljában található, mint a sorrendet megőrző szótár. Ezt nyugodtan használhatjuk.
Importálja a gyűjtemények modult. A modul a szabványos könyvtárban szerepel, és nem kell telepíteni.
import collections
Ha a következőket írja, a következő példákban kihagyhatja a gyűjtemények. sort.
from collections import OrderedDict
Az alábbiakban a OrderedDict használatának leírása következik.
- OrderedDict objektum létrehozása
- A OrderedDict a dict alosztálya
- Elemek áthelyezése az elejére vagy a végére
- Új elem hozzáadása tetszőleges pozícióban.
- Elemek átrendezése (átrendezése)
- Elemek rendezése kulcs vagy érték szerint
OrderedDict objektum létrehozása
A collections.OrderedDict() konstruktor segítségével létrehozható egy OrderedDict objektum.
Egy üres OrderedDict objektum létrehozása és értékek hozzáadása.
od = collections.OrderedDict()
od['k1'] = 1
od['k2'] = 2
od['k3'] = 3
print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
Lehetőség van arra is, hogy a konstruktornak argumentumokat adjunk meg.
Használhat kulcsszavas argumentumokat, kulcs-érték párok sorozatát (például tuple (kulcs, érték)) és így tovább. Ez utóbbi lehet lista vagy tuple, amennyiben kulcs-érték párról van szó.
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)])
A 3.5-ös verzióig a kulcsszó argumentumok sorrendje nem volt megőrizve, de a 3.6-os verzió óta ez megmaradt.
Változás a 3.6-os verzióban: A PEP 468 elfogadásával a OrderedDict konstruktor és az update() metódusnak átadott kulcsszóargumentumok sorrendje megmarad.
collections — Container datatypes — Python 3.10.0 Documentation
Normál szótárak (dict típusú objektumok) is átadhatók a konstruktornak, de olyan implementációk esetén, ahol a dict típus nem tartja meg a sorrendet, a belőle generált OrderedDict sem fogja megőrizni a sorrendet.
print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
A OrderedDict a dict alosztálya
A OrderedDict a dict alosztálya.
print(issubclass(collections.OrderedDict, dict))
# True
Az OrderedDict is ugyanazokkal a metódusokkal rendelkezik, mint a dict, és az elemek kinyerésére, módosítására, hozzáadására és eltávolítására szolgáló metódusok is ugyanazok, mint a 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)])
A részleteket lásd a következő cikkben.
- Kapcsolódó cikkek:Elemek hozzáadása egy szótárhoz és szótárak összekapcsolása Pythonban
Elemek áthelyezése az elejére vagy a végére
Az OrderedDict saját metódusát, a move_to_end() metódust használhatja, hogy egy elemet az elejére vagy a végére helyezzen.
Adja meg a kulcsot első argumentumként. Alapértelmezés szerint a végére kerül, de ha a második argumentum utolsó értéke hamis, akkor az elejére kerül.
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)])
Új elem hozzáadása tetszőleges pozícióban.
Lehetőség van egy új OrderedDict objektum létrehozására egy tetszőleges pozícióban hozzáadott új elemmel. Konkrétan ez a következő folyamat szerint történhet.
- Az item() metódussal megszerezhető nézetobjektumok listázása a list() segítségével.
- Kulcs-érték párokból álló tuple (kulcs, érték) hozzáadása a lista insert() metódusában.
- Új objektum létrehozása a collections.OrderedDict() konstruktornak való átadással.
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)])
Az insert() az első argumentumként a beillesztendő pozíciót, a második argumentumként pedig a beillesztendő elemet adja meg.
A példában egy új objektumot rendelünk az eredeti változóhoz, és magához az eredeti objektumhoz nem adunk hozzá új elemeket.
Elemek átrendezése (átrendezése)
Az elemek cseréje ugyanaz a folyamat, mint a fenti példában.
- Az item() metódussal megszerezhető nézetobjektumok listázása a list() segítségével.
- Elemek cseréje egy listában
- Új objektum létrehozása a collections.OrderedDict() konstruktornak való átadással.
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)])
Ha egy kulcsot szeretne megadni és helyettesíteni, használja az index() metódust az index (pozíció) kinyeréséhez a kulcsok listájából, ahogy az alább látható.
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)])
Elemek rendezése kulcs vagy érték szerint
Az item() metódussal megszerezhető nézetobjektumon alapuló, rendezett kulcs-érték párok (kulcs, érték) tuple listájának létrehozása, és átadása a collections.OrderedDict() konstruktornak egy új objektum létrehozásához.
A rendezés egy olyan névtelen függvény (lambda kifejezés) megadásával történik, amely a beépített sorted() függvény kulcsának argumentumaként egy kulcsot vagy értéket ad vissza egy tuplából (kulcs, érték).
Ha meg akarja fordítani a sorrendet, állítsa a sorted() fordított argumentumát true-ra.
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)])