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.
- Související články:Přidávání prvků do slovníku a spojování slovníků v jazyce Python
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.
- Seznam objektů zobrazení, které lze získat pomocí metody items() pomocí metody list().
- Přidání trojice (klíč, hodnota) dvojic klíč-hodnota v metodě insert() seznamu
- 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.
- Seznam objektů zobrazení, které lze získat pomocí metody items() pomocí metody list().
- Nahrazení prvků v seznamu
- 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)])