Cómo utilizar OrderedDict, un diccionario ordenado de Python.

Negocio

Los diccionarios de Python (objetos de tipo dict) no conservan el orden de los elementos; CPython lo hace desde la versión 3.6, pero depende de la implementación y es indefinido en otras implementaciones; la especificación del lenguaje conserva el orden desde la versión 3.7.

OrderedDict se proporciona en el módulo de colecciones de la biblioteca estándar como un diccionario que preserva el orden. Es seguro utilizarlo.

Importe el módulo de colecciones. Está incluido en la biblioteca estándar y no es necesario instalarlo.

import collections

Si escribe lo siguiente, puede omitir las colecciones. en los siguientes ejemplos.

from collections import OrderedDict

A continuación se describe cómo utilizar OrderedDict.

  • Creación de un objeto OrderedDict
  • OrderedDict es una subclase de dict
  • Mover elementos al principio o al final
  • Añade un nuevo elemento en cualquier posición.
  • Reorganizar (reordenar) los elementos
  • Ordenar elementos por clave o valor

Creación de un objeto OrderedDict

El constructor collections.OrderedDict() puede utilizarse para crear un objeto OrderedDict.

Crea un objeto OrderedDict vacío y añade valores.

od = collections.OrderedDict()

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

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

También es posible especificar argumentos para el constructor.

Puede utilizar argumentos de palabras clave, secuencias de pares clave-valor (como tuplas (clave, valor)), etc. Este último puede ser una lista o una tupla siempre que sea un par clave-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)])

Hasta la versión 3.5, no se conservaba el orden de los argumentos de las palabras clave, pero desde la versión 3.6, se conserva.

Cambiado en la versión 3.6: Con la aceptación del PEP 468, se conserva el orden del constructor de OrderedDict y de los argumentos de las palabras clave que se pasan al método update().
collections — Container datatypes — Python 3.10.0 Documentation

Los diccionarios normales (objetos de tipo dict) también pueden pasarse al constructor, pero en el caso de implementaciones en las que el tipo dict no preserva el orden, el OrderedDict generado a partir de él tampoco lo hará.

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

OrderedDict es una subclase de dict

OrderedDict es una subclase de dict.

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

OrderedDict también tiene los mismos métodos que dict, y los métodos para obtener, cambiar, añadir y eliminar elementos son los mismos 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)])

Consulte el siguiente artículo para más detalles.

Mover elementos al principio o al final

Puedes utilizar el método propio de OrderedDict move_to_end() para mover un elemento al principio o al final.

Especifica la clave como primer argumento. Por defecto se mueve al final, pero si el segundo argumento último es falso, se moverá al principio.

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

Añade un nuevo elemento en cualquier posición.

Es posible crear un nuevo objeto OrderedDict con un nuevo elemento añadido en una posición arbitraria. En concreto, esto se puede hacer en el siguiente flujo.

  1. Enumera los objetos de la vista que se pueden obtener con el método items() utilizando list().
  2. Añadir una tupla (clave, valor) de pares clave-valor en el método insert() de la lista
  3. Crea un nuevo objeto pasándolo 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ón a insertar como primer argumento, y el elemento a insertar como segundo argumento.

En el ejemplo, se asigna un nuevo objeto a la variable original, y no se añaden nuevos elementos al propio objeto original.

Reorganizar (reordenar) los elementos

La sustitución de elementos es el mismo proceso que en el ejemplo anterior.

  1. Enumera los objetos de la vista que se pueden obtener con el método items() utilizando list().
  2. Reemplazar elementos de una lista
  3. Crea un nuevo objeto pasándolo 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 desea especificar una clave y reemplazarla, utilice el método index() para obtener el índice (posición) de la lista de claves, como se muestra a continuación.

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

Ordenar elementos por clave o valor

Crea una lista de tuplas (clave, valor) de pares clave-valor ordenados basada en el objeto de la vista que se puede obtener mediante el método items(), y la pasa al constructor collections.OrderedDict() para crear un nuevo objeto.

La ordenación se realiza especificando una función anónima (expresión lambda) que devuelve una clave o un valor de una tupla (clave, valor) como argumento clave de la función incorporada sorted().

Si desea invertir el orden, establezca el argumento inverso de sorted() en 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