Kuidas kasutada OrderedDict, Pythoni korrastatud sõnaraamatut.

Äri

Pythoni sõnastikud (tüübi dict objektid) ei säilita elementide järjekorda; CPython on seda teinud alates 3.6. versioonist, kuid teistes implementatsioonides on see rakendusest sõltuv ja ebamäärane; keele spetsifikatsioon on säilitanud järjekorra alates 3.7. versioonist.

OrderedDict on standardraamatukogu kollektsioonide moodulis esitatud sõnastikuna, mis säilitab järjekorra. Seda on ohutu kasutada.

Impordi kogude moodul. See sisaldub standardraamatukogus ja seda ei ole vaja installeerida.

import collections

Kui kirjutate järgmist, võite järgmistes näidetes kollektsioonid ära jätta.

from collections import OrderedDict

Järgnevalt kirjeldatakse, kuidas kasutada OrderedDict'i.

  • OrderedDict objekti loomine
  • OrderedDict on dict alamklass
  • Liigutage elemendid algusesse või lõppu
  • Uue elemendi lisamine suvalisse positsiooni.
  • Elementide ümberkorraldamine (ümberjärjestamine)
  • Sorteeri elemendid võtme või väärtuse järgi

OrderedDict objekti loomine

Konstruktorit collections.OrderedDict() saab kasutada OrderedDict-objekti loomiseks.

Looge tühi OrderedDict objekt ja lisage väärtused.

od = collections.OrderedDict()

od['k1'] = 1
od['k2'] = 2
od['k3'] = 3

print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

Konstruktorile on võimalik määrata ka argumente.

Võite kasutada võtmesõnaargumente, võtme-väärtuspaaride jadasid (näiteks tuples (key, value)) jne. Viimane võib olla nimekiri või tupel, kui see on võti-väärtuspaar.

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)])

Kuni versioonini 3.5 ei säilitatud võtmesõna argumentide järjekorda, kuid alates versioonist 3.6 on see nüüd säilinud.

Muudetud versioonis 3.6: OrderedDict konstruktori järjekord ja meetodile update() edastatud võtmesõnaargumendid on säilinud.
collections — Container datatypes — Python 3.10.0 Documentation

Konstruktorile saab üle anda ka tavalisi sõnastikke (dict-tüüpi objektid), kuid rakenduste puhul, kus dict-tüüp ei säilita järjekorda, ei säilita ka sellest genereeritud OrderedDict järjekorda.

print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

OrderedDict on dict alamklass

OrderedDict on dict alamklass.

print(issubclass(collections.OrderedDict, dict))
# True

OrderedDict'il on samuti samad meetodid kui dict'il ning elementide saamise, muutmise, lisamise ja eemaldamise meetodid on samad kui dict'il.

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)])

Üksikasjalikumat teavet leiate järgmisest artiklist.

Liigutage elemendid algusesse või lõppu

Saate kasutada OrderedDict'i enda meetodit move_to_end(), et liigutada elementi algusesse või lõppu.

Määrake esimese argumendina võti. Vaikimisi liigutatakse lõppu, kuid kui teine argument on vale, liigutatakse see algusesse.

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)])

Uue elemendi lisamine suvalisse positsiooni.

On võimalik luua uus OrderedDict objekt, millele on lisatud uus element suvalisse kohta. Konkreetselt saab seda teha järgmises voos.

  1. Loetelu vaateobjektidest, mida saab saada meetodi items() abil list() abil.
  2. Lisada loendi insert() meetodisse võtmeväärtuspaaridest koosnev tupel (võti, väärtus).
  3. Loo uus objekt, andes selle üle konstruktorile 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() määrab esimese argumendina sisestatava positsiooni ja teise argumendina sisestatava elemendi.

Näites määratakse algsele muutujale uus objekt ja algsele objektile endale uusi elemente ei lisata.

Elementide ümberkorraldamine (ümberjärjestamine)

Elementide asendamine on sama protsess nagu ülaltoodud näites.

  1. Loetelu vaateobjektidest, mida saab saada meetodi items() abil list() abil.
  2. Elementide asendamine loetelus
  3. Loo uus objekt, andes selle üle konstruktorile 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)])

Kui soovite määrata võtme ja asendada selle, kasutage meetodit index(), et saada indeks (positsioon) võtmete loendist, nagu allpool näidatud.

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)])

Sorteeri elemendid võtme või väärtuse järgi

Luua loend topeltest (võti, väärtus) sorteeritud võtmeväärtuspaaride loend, mis põhineb vaateobjektil, mille saab meetodiga items(), ja anda see üle konstruktorile collections.OrderedDict() uue objekti loomiseks.

Sorteerimine toimub anonüümse funktsiooni (lambda-avalduse) määramisega, mis tagastab võtme või väärtuse tuplist (võti, väärtus), mis on sisseehitatud funktsiooni sorted() argumendiks võti.

Kui soovite järjekorda ümber pöörata, määrake sorted() funktsiooni reverse argumendiks 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)])