Com utilitzar OrderedDict, un diccionari ordenat de Python.

Negocis

Els diccionaris de Python (objectes de tipus dict) no conserven l’ordre dels elements; CPython ho fa des de la 3.6, però depèn de la implementació i és indefinit en altres implementacions; l’especificació de l’idioma ha conservat l’ordre des del 3.7.

OrderedDict es proporciona al mòdul de col·leccions de la biblioteca estàndard com a diccionari que conserva l’ordre. És segur utilitzar aquest.

Importa el mòdul de col·leccions. S’inclou a la biblioteca estàndard i no cal instal·lar-lo.

import collections

Si escriviu el següent, podeu ometre les col·leccions. en els exemples següents.

from collections import OrderedDict

A continuació es mostra una descripció de com utilitzar OrderedDict.

  • Creació d’un objecte OrderedDict
  • OrderedDict és una subclasse de dict
  • Mou els elements al principi o al final
  • Afegiu un element nou a qualsevol posició.
  • Reordenar (reordenar) els elements
  • Ordena els elements per clau o valor

Creació d’un objecte OrderedDict

El constructor collections.OrderedDict() es pot utilitzar per crear un objecte OrderedDict.

Creeu un objecte OrderedDict buit i afegiu valors.

od = collections.OrderedDict()

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

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

També és possible especificar arguments al constructor.

Podeu utilitzar arguments de paraula clau, seqüències de parells clau-valor (com ara tuples (clau, valor)), etc. Aquest últim pot ser una llista o una tupla sempre que sigui un parell clau-valor.

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

Fins a la versió 3.5, l’ordre dels arguments de la paraula clau no es conservava, però des de la versió 3.6, ara es conserva.

Canviat a la versió 3.6: amb l’acceptació de PEP 468, es conserva l’ordre del constructor OrderedDict i els arguments de la paraula clau passats al mètode update().
collections — Container datatypes — Python 3.10.0 Documentation

Els diccionaris normals (objectes de tipus dict) també es poden passar al constructor, però en el cas d’implementacions on el tipus dict no conserva l’ordre, el OrderedDict generat a partir d’ell tampoc no conservarà l’ordre.

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

OrderedDict és una subclasse de dict

OrderedDict és una subclasse de dict.

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

OrderedDict també té els mateixos mètodes que dict, i els mètodes per obtenir, canviar, afegir i eliminar elements són els mateixos que 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)])

Consulteu l’article següent per obtenir més informació.

Mou els elements al principi o al final

Podeu utilitzar el mètode propi de OrderedDict move_to_end() per moure un element al principi o al final.

Especifiqueu la clau com a primer argument. El valor per defecte és moure’s al final, però si el darrer argument del segon és fals, es mourà al principi.

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

Afegiu un element nou a qualsevol posició.

És possible crear un nou objecte OrderedDict amb un element nou afegit en una posició arbitrària. Concretament, això es pot fer en el següent flux.

  1. Llista els objectes de vista que es poden obtenir amb el mètode items() mitjançant list().
  2. Afegiu una tupla (clau, valor) de parells clau-valor al mètode insert() de la llista
  3. Creeu un objecte nou passant-lo al constructor 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() especifica la posició que s’ha d’inserir com a primer argument i l’element que s’ha d’inserir com a segon argument.

A l’exemple, s’assigna un objecte nou a la variable original i no s’afegeix cap element nou a l’objecte original.

Reordenar (reordenar) els elements

La substitució d’elements és el mateix procés que a l’exemple anterior.

  1. Llista els objectes de vista que es poden obtenir amb el mètode items() mitjançant list().
  2. Substitueix elements d’una llista
  3. Creeu un objecte nou passant-lo al constructor 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)])

Si voleu especificar una clau i substituir-la, utilitzeu el mètode index() per obtenir l’índex (posició) de la llista de claus tal com es mostra a continuació.

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

Ordena els elements per clau o valor

Creeu una llista de tuples (clau, valor) de parells clau-valor ordenats en funció de l’objecte de vista que es pot obtenir amb el mètode items() i passeu-lo al constructor collections.OrderedDict() per crear un objecte nou.

L’ordenació es realitza especificant una funció anònima (expressió lambda) que retorna una clau o un valor d’una tupla (clau, valor) com a clau d’argument de la funció integrada sortd().

Si voleu invertir l’ordre, establiu l’argument invers de sortd() a 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)])
Copied title and URL