Hvernig á að nota OrderedDict, Python-pöntuð orðabók.

Viðskipti

Python orðabækur (hlutir af gerðinni dict) varðveita ekki röð þátta; CPython hefur gert það síðan 3.6, en það er útfærsluháð og óákveðið í öðrum útfærslum; tungumálaforskriftin hefur varðveitt röðina frá 3.7.

OrderedDict er að finna í safneiningu staðlaða bókasafnsins sem orðabók sem varðveitir röðina. Það er óhætt að nota þennan.

Flytja inn söfnunareininguna. Það er innifalið í venjulegu bókasafni og þarf ekki að setja það upp.

import collections

Ef þú skrifar eftirfarandi geturðu sleppt söfnunum. í eftirfarandi dæmum.

from collections import OrderedDict

Eftirfarandi er lýsing á því hvernig á að nota OrderedDict.

  • Að búa til OrderedDict hlut
  • OrderedDict er undirflokkur dict
  • Færa þætti í byrjun eða lok
  • Bættu við nýjum þætti á hvaða stað sem er.
  • Endurraða (endurraða) þáttum
  • Raða þáttum eftir lykli eða gildi

Að búa til OrderedDict hlut

Smiðirnir collections.OrderedDict() er hægt að nota til að búa til OrderedDict hlut.

Búðu til tóman OrderedDict hlut og bættu við gildum.

od = collections.OrderedDict()

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

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

Það er líka hægt að tilgreina rök fyrir byggingaraðilanum.

Þú getur notað lykilorðarrök, raðir af lykilgildapörum (eins og tuples (lykill, gildi)) og svo framvegis. Hið síðarnefnda getur verið listi eða tuple svo framarlega sem það er lykilgildi par.

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

Fram að útgáfu 3.5 var röð leitarorðafræða ekki varðveitt, en frá útgáfu 3.6 er hún nú varðveitt.

Breytt í útgáfu 3.6: Með samþykki PEP 468 er röð OrderedDict smiðsins og lykilorðarrök sem send eru til update() aðferðarinnar varðveitt.
collections — Container datatypes — Python 3.10.0 Documentation

Venjulegar orðabækur (hlutir af dict gerð) geta einnig verið sendar til byggingaraðilans, en ef um er að ræða útfærslur þar sem dict tegundin varðveitir ekki röð, þá mun OrderedDict sem myndast úr henni heldur ekki varðveita röð.

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

OrderedDict er undirflokkur dict

OrderedDict er undirflokkur dict.

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

OrderedDict hefur einnig sömu aðferðir og dict, og aðferðirnar til að fá, breyta, bæta við og fjarlægja þætti eru þær sömu og 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)])

Sjá eftirfarandi grein fyrir frekari upplýsingar.

Færa þætti í byrjun eða lok

Þú getur notað eigin aðferð OrderedDict move_to_end() til að færa frumefni í byrjun eða lok.

Tilgreindu lykilinn sem fyrstu röksemd. Sjálfgefið er að færa til enda, en ef seinni röksemdin er röng, verður hún færð í byrjun.

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

Bættu við nýjum þætti á hvaða stað sem er.

Það er hægt að búa til nýjan OrderedDict hlut með nýjum þætti bætt við á handahófskenndri stöðu. Nánar tiltekið er hægt að gera þetta í eftirfarandi flæði.

  1. Listaðu skoðunarhlutina sem hægt er að fá með items() aðferðinni með því að nota list().
  2. Bættu við tuple (lykill, gildi) af lykilgildapörum í insert() aðferð listans
  3. Búðu til nýjan hlut með því að senda hann til smíðasafnanna.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() tilgreinir stöðuna sem á að setja inn sem fyrstu röksemdina og þáttinn sem á að setja inn sem seinni röksemdina.

Í dæminu er nýjum hlut úthlutað til upprunalegu breytunnar og engum nýjum þáttum er bætt við upprunalega hlutinn sjálfan.

Endurraða (endurraða) þáttum

Að skipta um þætti er sama ferli og í dæminu hér að ofan.

  1. Listaðu skoðunarhlutina sem hægt er að fá með items() aðferðinni með því að nota list().
  2. Skiptu um þætti í lista
  3. Búðu til nýjan hlut með því að senda hann til smíðasafnanna.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)])

Ef þú vilt tilgreina lykil og skipta um hann skaltu nota index() aðferðina til að fá vísitöluna (stöðuna) af lyklalistanum eins og sýnt er hér að neðan.

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

Raða þáttum eftir lykli eða gildi

Búðu til lista yfir túlla (lykill, gildi) af flokkuðum lykilgildapörum byggt á útsýnishlutnum sem hægt er að fá með items() aðferðinni og sendu það til smiðjusafnanna.OrderedDict() til að búa til nýjan hlut.

Flokkun er framkvæmd með því að tilgreina nafnlausa fall (lambda tjáning) sem skilar lykli eða gildi úr tuple (lykill, gildi) sem röklykil innbyggðu fallsins sorted().

Ef þú vilt snúa röðinni við, stilltu öfugri rök sorted() á satt.

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