Ako používať OrderedDict, usporiadaný slovník jazyka Python.

obchodné

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.

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.

  1. Zoznam objektov zobrazenia, ktoré možno získať pomocou metódy items() pomocou metódy list().
  2. Pridanie tuplu (kľúč, hodnota) dvojíc kľúč-hodnota v metóde insert() zoznamu
  3. 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.

  1. Zoznam objektov zobrazenia, ktoré možno získať pomocou metódy items() pomocou metódy list().
  2. Nahradiť prvky v zozname
  3. 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)])
Copied title and URL