Як выкарыстоўваць OrderedDict, упарадкаваны слоўнік Python.

Бізнэс

Слоўнікі 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. Пералічыце аб’екты прагляду, якія можна атрымаць з дапамогай метаду items() з дапамогай спісу().
  2. Дадаць картэж (ключ, значэнне) пар ключ-значэнне ў метад insert() спісу
  3. Стварыце новы аб’ект, перадаўшы яго ў канструктар 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() вызначае пазіцыю, якую трэба ўставіць у якасці першага аргумента, і элемент, які будзе ўстаўлены ў якасці другога аргумента.

У прыкладзе зыходнай зменнай прысвойваецца новы аб’ект, а ў сам зыходны аб’ект не дадаюцца новыя элементы.

Пераставіць (перапарадкаваць) элементы

Замена элементаў – гэта той жа працэс, што і ў прыкладзе вышэй.

  1. Пералічыце аб’екты прагляду, якія можна атрымаць з дапамогай метаду items() з дапамогай спісу().
  2. Замяніць элементы ў спісе
  3. Стварыце новы аб’ект, перадаўшы яго ў канструктар 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)])

Калі вы хочаце ўказаць ключ і замяніць яго, выкарыстоўвайце метад 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(), і перадайце яго канструктару collections.OrderedDict(), каб стварыць новы аб’ект.

Сартаванне выконваецца шляхам пазначэння ананімнай функцыі (лямбда-выраз), якая вяртае ключ або значэнне з картэжа (ключ, значэнне) у якасці ключа аргументу ўбудаванай функцыі sorted().

Калі вы хочаце змяніць парадак, усталюйце для адваротнага аргумента sorted() значэнне 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)])