Python-оор захиалгат толь бичиг болох OrderedDict-ийг хэрхэн ашиглах вэ.

Бизнес эрхэлдэг

Python толь бичиг (dict төрлийн объектууд) элементүүдийн дарааллыг хадгалдаггүй; CPython нь 3.6-аас хойш үүнийг хийсэн боловч энэ нь хэрэгжилтээс хамааралтай бөгөөд бусад хэрэгжүүлэлтүүдэд тодорхой бус байдаг; хэлний тодорхойлолт нь 3.7-с хойшхи дарааллыг хадгалсан.

OrderedDict нь стандарт номын сангийн цуглуулгын модульд дарааллыг хадгалдаг толь бичиг болгон өгдөг. Үүнийг ашиглах нь аюулгүй юм.

Цуглуулгын модулийг импортлох. Энэ нь стандарт номын санд багтсан бөгөөд суулгах шаардлагагүй.

import collections

Хэрэв та дараах зүйлийг бичвэл цуглуулгуудыг орхиж болно. дараах жишээнүүдэд.

from collections import OrderedDict

Дараах нь OrderedDict-ийг хэрхэн ашиглах тухай тайлбар юм.

  • OrderedDict объект үүсгэх
  • OrderedDict нь dict-ийн дэд ангилал юм
  • Элементүүдийг эхлэл эсвэл төгсгөл рүү шилжүүлнэ үү
  • Дурын байрлалд шинэ элемент нэмнэ үү.
  • Элементүүдийг дахин цэгцлэх (дахин эрэмбэлэх).
  • Элементүүдийг түлхүүр эсвэл утгаараа эрэмбэлэх

OrderedDict объект үүсгэх

Collections.OrderedDict() бүтээгчийг OrderedDict объект үүсгэхэд ашиглаж болно.

Хоосон OrderedDict объект үүсгэж, утгыг нэмнэ үү.

od = collections.OrderedDict()

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

print(od)
# 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)]))
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)])

3.5 хувилбар хүртэл түлхүүр үгийн аргументуудын дараалал хадгалагдаагүй байсан ч 3.6 хувилбараас хойш одоо хадгалагдаж байна.

3.6 хувилбарт өөрчлөгдсөн: PEP 468-ийг хүлээн авснаар OrderedDict бүтээгчийн дараалал болон update() арга руу дамжуулсан түлхүүр үгийн аргументууд хадгалагдана.
collections — Container datatypes — Python 3.10.0 Documentation

Ердийн толь бичгүүдийг (dict төрлийн объектууд) мөн бүтээгчид дамжуулж болох боловч dict төрөл нь дарааллыг хадгалахгүй хэрэгжүүлэх тохиолдолд үүнээс үүсгэсэн OrderedDict нь дарааллыг хадгалахгүй.

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

OrderedDict нь dict-ийн дэд ангилал юм

OrderedDict нь dict-ийн дэд ангилал юм.

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

OrderedDict нь мөн dict-тэй ижил аргуудтай бөгөөд элемент авах, өөрчлөх, нэмэх, хасах аргууд нь 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)])

Дэлгэрэнгүйг дараах нийтлэлээс үзнэ үү.

Элементүүдийг эхлэл эсвэл төгсгөл рүү шилжүүлнэ үү

Та OrderedDict-ийн өөрийн move_to_end() аргыг ашиглан элементийг эхэнд эсвэл төгсгөл рүү зөөж болно.

Түлхүүрийг эхний аргумент болгон зааж өгнө үү. Өгөгдмөл нь төгсгөл рүү шилжих боловч хэрэв сүүлчийн хоёр дахь аргумент худал байвал эхэнд нь шилжүүлнэ.

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

Дурын байрлалд шинэ элемент нэмнэ үү.

Дурын байрлалд нэмсэн шинэ элементээр OrderedDict шинэ объект үүсгэх боломжтой. Тодруулбал, үүнийг дараах урсгалаар хийж болно.

  1. list() ашиглан items() аргаар авч болох харах объектуудыг жагсаана.
  2. Жагсаалтын insert() аргад түлхүүр-утга хосын багц (түлхүүр, утга) нэмнэ үү
  3. Шинэ объектыг үүсгэгчийн цуглуулга руу шилжүүлж үүсгэнэ үү.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() нь эхний аргумент болгон оруулах байрлалыг, хоёр дахь аргумент болгон оруулах элементийг зааж өгнө.

Жишээн дээр анхны хувьсагчид шинэ объект оноогдсон бөгөөд анхны объектод шинэ элемент нэмээгүй болно.

Элементүүдийг дахин цэгцлэх (дахин эрэмбэлэх).

Элементүүдийг солих нь дээрх жишээн дээрхтэй ижил үйл явц юм.

  1. list() ашиглан items() аргаар авч болох харах объектуудыг жагсаана.
  2. Жагсаалтын элементүүдийг солих
  3. Шинэ объектыг үүсгэгчийн цуглуулга руу шилжүүлж үүсгэнэ үү.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)])

Хэрэв та түлхүүрийг зааж, солихыг хүсвэл доор үзүүлсэн шиг түлхүүрүүдийн жагсаалтаас индекс (байрлал) авахын тулд index() аргыг ашиглана уу.

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

Элементүүдийг түлхүүр эсвэл утгаараа эрэмбэлэх

items() аргаар олж авч болох харах объект дээр тулгуурлан эрэмбэлэгдсэн түлхүүр утгын хосуудын багцуудын жагсаалтыг (түлхүүр, утга) үүсгэж, шинэ объект үүсгэхийн тулд цуглуулагчийн цуглуулгад дамжуулна.

Эрэмбэлэх нь нэргүй функцийг (lambda илэрхийлэл) зааж өгөх замаар хийгддэг бөгөөд энэ нь залгаасаас (түлхүүр, утга) түлхүүр эсвэл утгыг буцаадаг sorted() функцийн аргумент түлхүүр болгон.

Хэрэв та дарааллыг буцаахыг хүсвэл sorted()-ийн урвуу аргументыг үнэн болгож тохируулна уу.

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