Jak používat OrderedDict, uspořádaný slovník jazyka Python.

Podnikání

Slovníky jazyka Python (objekty typu dict) nezachovávají pořadí prvků; CPython tak činí od verze 3.6, ale v ostatních implementacích je to závislé na implementaci a neurčité; specifikace jazyka zachovává pořadí od verze 3.7.

OrderedDict je k dispozici v modulu kolekcí standardní knihovny jako slovník, který zachovává pořadí. Jeho použití je bezpečné.

Import modulu kolekcí. Je součástí standardní knihovny a není třeba jej instalovat.

import collections

Pokud píšete následující, můžete v následujících příkladech kolekce vynechat.

from collections import OrderedDict

Následuje popis použití OrderedDict.

  • Vytvoření objektu OrderedDict
  • OrderedDict je podtřída třídy dict
  • Přesunutí prvků na začátek nebo konec
  • Přidání nového prvku na libovolnou pozici.
  • Změna uspořádání (změna pořadí) prvků
  • Seřadit prvky podle klíče nebo hodnoty

Vytvoření objektu OrderedDict

K vytvoření objektu OrderedDict lze použít konstruktor collections.OrderedDict().

Vytvoření prázdného objektu OrderedDict a přidání hodnot.

od = collections.OrderedDict()

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

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

Je také možné zadat argumenty konstruktoru.

Můžete použít argumenty klíčových slov, posloupnosti dvojic klíč-hodnota (například tuply (klíč, hodnota)) atd. Posledním z nich může být seznam nebo tuple, pokud se jedná o dvojici klíč-hodnota.

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

Do verze 3.5 se pořadí argumentů klíčových slov nezachovávalo, ale od verze 3.6 se již zachovává.

Změněno ve verzi 3.6: S přijetím PEP 468 je zachováno pořadí konstruktoru OrderedDict a argumentů klíčových slov předávaných metodě update().
collections — Container datatypes — Python 3.10.0 Documentation

Konstruktoru lze předat i normální slovníky (objekty typu dict), ale v případě implementací, kde typ dict nezachovává pořadí, nebude pořadí zachovávat ani z něj vygenerovaný OrderedDict.

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

OrderedDict je podtřída třídy dict

OrderedDict je podtřída třídy dict.

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

OrderedDict má také stejné metody jako dict a metody pro získání, změnu, přidání a odebrání prvků jsou stejné jako u 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)])

Podrobnosti naleznete v následujícím článku.

Přesunutí prvků na začátek nebo konec

K přesunu prvku na začátek nebo na konec můžete použít vlastní metodu move_to_end() souboru OrderedDict.

Jako první argument zadejte klíč. Ve výchozím nastavení se přesune na konec, ale pokud je druhý argument false, přesune se na začátek.

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

Přidání nového prvku na libovolnou pozici.

Je možné vytvořit nový objekt OrderedDict s novým prvkem přidaným na libovolné místo. Konkrétně to lze provést následujícím postupem.

  1. Seznam objektů zobrazení, které lze získat pomocí metody items() pomocí metody list().
  2. Přidání trojice (klíč, hodnota) dvojic klíč-hodnota v metodě insert() seznamu
  3. Vytvoření nového objektu předáním konstruktoru 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)])

funkce insert() zadává jako první argument pozici, která má být vložena, a jako druhý argument prvek, který má být vložen.

V příkladu je původní proměnné přiřazen nový objekt a do původního objektu nejsou přidány žádné nové prvky.

Změna uspořádání (změna pořadí) prvků

Výměna prvků je stejný postup jako ve výše uvedeném příkladu.

  1. Seznam objektů zobrazení, které lze získat pomocí metody items() pomocí metody list().
  2. Nahrazení prvků v seznamu
  3. Vytvoření nového objektu předáním konstruktoru 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)])

Pokud chcete zadat klíč a nahradit jej, použijte metodu index() pro získání indexu (pozice) ze seznamu klíčů, jak je uvedeno níže.

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

Seřadit prvky podle klíče nebo hodnoty

Vytvoří seznam tuplů (klíč, hodnota) seřazených dvojic klíč-hodnota na základě objektu view, který lze získat metodou items(), a předá jej konstruktoru collections.OrderedDict() pro vytvoření nového objektu.

Třídění se provádí zadáním anonymní funkce (lambda výrazu), která vrací klíč nebo hodnotu z tuplu (klíč, hodnota) jako argument klíče vestavěné funkce sorted().

Pokud chcete pořadí obrátit, nastavte argument reverse funkce sorted() na hodnotu 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)])