Az OrderedDict, egy Python rendezett szótár használata.

Üzleti

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.

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.

  1. Az item() metódussal megszerezhető nézetobjektumok listázása a list() segítségével.
  2. Kulcs-érték párokból álló tuple (kulcs, érték) hozzáadása a lista insert() metódusában.
  3. Ú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.

  1. Az item() metódussal megszerezhető nézetobjektumok listázása a list() segítségével.
  2. Elemek cseréje egy listában
  3. Ú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)])