Paano gamitin ang OrderedDict, isang inayos na diksyunaryo ng Python.

Negosyo

Hindi pinapanatili ng mga diksyonaryo ng Python (mga bagay na may uri ng dict) ang pagkakasunud-sunod ng mga elemento; Ginawa ito ng CPython mula noong 3.6, ngunit ito ay umaasa sa pagpapatupad at hindi tiyak sa iba pang mga pagpapatupad; napanatili ng detalye ng wika ang kaayusan mula noong 3.7.

Ang OrderedDict ay ibinibigay sa module ng mga koleksyon ng karaniwang aklatan bilang isang diksyunaryo na nagpapanatili ng pagkakasunud-sunod. Ito ay ligtas na gamitin ang isang ito.

I-import ang module ng mga koleksyon. Ito ay kasama sa karaniwang aklatan at hindi kailangang i-install.

import collections

Kung isusulat mo ang sumusunod, maaari mong alisin ang mga koleksyon. sa mga sumusunod na halimbawa.

from collections import OrderedDict

Ang sumusunod ay isang paglalarawan kung paano gamitin ang OrderedDict.

  • Paglikha ng isang OrderedDict object
  • Ang OrderedDict ay isang subclass ng dict
  • Ilipat ang mga elemento sa simula o dulo
  • Magdagdag ng bagong elemento sa anumang posisyon.
  • Muling ayusin (muling ayusin) ang mga elemento
  • Pagbukud-bukurin ang mga elemento ayon sa susi o halaga

Paglikha ng isang OrderedDict object

Ang constructor collections.OrdedDict() ay maaaring gamitin upang lumikha ng isang OrderedDict object.

Lumikha ng walang laman na OrderedDict object at magdagdag ng mga value.

od = collections.OrderedDict()

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

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

Posible rin na tukuyin ang mga argumento sa constructor.

Maaari kang gumamit ng mga argumento ng keyword, mga pagkakasunud-sunod ng mga pares ng key-value (tulad ng mga tuple (key, value)), at iba pa. Ang huli ay maaaring isang listahan o isang tuple hangga’t ito ay isang key-value pair.

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

Hanggang sa bersyon 3.5, ang pagkakasunud-sunod ng mga argumento ng keyword ay hindi napanatili, ngunit mula noong bersyon 3.6, ito ay napanatili na ngayon.

Binago sa bersyon 3.6: Sa pagtanggap ng PEP 468, ang pagkakasunud-sunod ng OrderedDict constructor at ang mga argumento ng keyword na ipinasa sa update() na paraan ay napanatili.
collections — Container datatypes — Python 3.10.0 Documentation

Ang mga normal na diksyunaryo (mga bagay na uri ng dict) ay maaari ding ipasa sa tagabuo, ngunit sa kaso ng mga pagpapatupad kung saan ang uri ng dict ay hindi nagpapanatili ng kaayusan, ang OrderedDict na nabuo mula dito ay hindi rin magpapanatili ng kaayusan.

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

Ang OrderedDict ay isang subclass ng dict

Ang OrderedDict ay isang subclass ng dict.

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

Ang OrderedDict ay mayroon ding parehong mga pamamaraan tulad ng dict, at ang mga pamamaraan para sa pagkuha, pagbabago, pagdaragdag, at pag-alis ng mga elemento ay kapareho ng 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)])

Tingnan ang sumusunod na artikulo para sa mga detalye.

Ilipat ang mga elemento sa simula o dulo

Maaari mong gamitin ang sariling pamamaraan ng OrderedDict na move_to_end() upang ilipat ang isang elemento sa simula o dulo.

Tukuyin ang susi bilang unang argumento. Ang default ay lumipat sa dulo, ngunit kung ang huling argumento ay mali, ililipat ito sa simula.

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

Magdagdag ng bagong elemento sa anumang posisyon.

Posibleng gumawa ng bagong OrderedDict object na may bagong elemento na idinagdag sa isang arbitrary na posisyon. Sa partikular, ito ay maaaring gawin sa sumusunod na daloy.

  1. Ilista ang mga view object na maaaring makuha gamit ang items() method gamit ang list().
  2. Magdagdag ng tuple (key, value) ng mga pares ng key-value sa insert() na paraan ng listahan
  3. Gumawa ng bagong object sa pamamagitan ng pagpasa nito sa mga constructor collections.OrdedDict()
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() ay tumutukoy sa posisyong ilalagay bilang unang argumento, at ang elementong ilalagay bilang pangalawang argumento.

Sa halimbawa, ang isang bagong bagay ay itinalaga sa orihinal na variable, at walang mga bagong elemento ang idinagdag sa orihinal na bagay mismo.

Muling ayusin (muling ayusin) ang mga elemento

Ang pagpapalit ng mga elemento ay ang parehong proseso tulad ng sa halimbawa sa itaas.

  1. Ilista ang mga view object na maaaring makuha gamit ang items() method gamit ang list().
  2. Palitan ang mga elemento sa isang listahan
  3. Gumawa ng bagong object sa pamamagitan ng pagpasa nito sa mga constructor collections.OrdedDict()
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)])

Kung gusto mong tukuyin ang isang susi at palitan ito, gamitin ang index() na paraan upang makuha ang index (posisyon) mula sa listahan ng mga susi tulad ng ipinapakita sa ibaba.

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

Pagbukud-bukurin ang mga elemento ayon sa susi o halaga

Gumawa ng listahan ng mga tuple (key, value) ng pinagsunod-sunod na key-value pairs batay sa view object na maaaring makuha ng items() method, at ipasa ito sa constructor collections.OrderedDict() para gumawa ng bagong object.

Isinasagawa ang pag-uuri sa pamamagitan ng pagtukoy ng anonymous na function (lambda expression) na nagbabalik ng key o value mula sa isang tuple (key, value) bilang argument key ng built-in na function sorted().

Kung gusto mong baligtarin ang pagkakasunud-sunod, itakda ang reverse argument ng sorted() sa 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)])