Como usar OrderedDict, un dicionario ordenado de Python.

Negocios

Os dicionarios de Python (obxectos de tipo dict) non conservan a orde dos elementos; CPython fíxoo desde 3.6, pero é dependente da implementación e é indefinido noutras implementacións; a especificación lingüística conservou a orde desde 3.7.

OrderedDict ofrécese no módulo de coleccións da biblioteca estándar como un dicionario que conserva a orde. É seguro usar este.

Importar o módulo de coleccións. Está incluído na biblioteca estándar e non é necesario instalar.

import collections

Se escribes o seguinte, podes omitir as coleccións. nos seguintes exemplos.

from collections import OrderedDict

A seguinte é unha descrición de como usar OrderedDict.

  • Creando un obxecto OrderedDict
  • OrderedDict é unha subclase de dict
  • Move elementos ao principio ou ao final
  • Engade un elemento novo en calquera posición.
  • Reorganizar (reordenar) elementos
  • Ordenar elementos por clave ou valor

Creando un obxecto OrderedDict

O construtor collections.OrderedDict() pódese usar para crear un obxecto OrderedDict.

Crea un obxecto OrderedDict baleiro e engade valores.

od = collections.OrderedDict()

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

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

Tamén é posible especificar argumentos para o construtor.

Podes usar argumentos de palabras clave, secuencias de pares clave-valor (como tuplas (clave, valor)), etc. Este último pode ser unha lista ou unha tupla sempre que sexa 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)])

Ata a versión 3.5, a orde dos argumentos das palabras clave non se conservaba, pero desde a versión 3.6, agora consérvase.

Modificado na versión 3.6: coa aceptación de PEP 468, consérvase a orde do construtor OrderedDict e os argumentos da palabra clave pasados ​​ao método update().
collections — Container datatypes — Python 3.10.0 Documentation

Os dicionarios normais (obxectos de tipo dict) tamén se poden pasar ao construtor, pero no caso de implementacións onde o tipo dict non conserva a orde, o OrderedDict xerado a partir del tampouco conservará a orde.

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

OrderedDict é unha subclase de dict

OrderedDict é unha subclase de dict.

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

OrderedDict tamén ten os mesmos métodos que dict, e os métodos para obter, cambiar, engadir e eliminar elementos son os mesmos 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 o seguinte artigo para obter máis detalles.

Move elementos ao principio ou ao final

Podes usar o propio método de OrderedDict move_to_end() para mover un elemento ao principio ou ao final.

Especifique a clave como primeiro argumento. O predeterminado é mover ao final, pero se o último argumento é falso, moverase ao 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)])

Engade un elemento novo en calquera posición.

É posible crear un novo obxecto OrderedDict cun novo elemento engadido nunha posición arbitraria. En concreto, pódese facer no seguinte fluxo.

  1. Lista os obxectos de vista que se poden obter co método items() usando list().
  2. Engade unha tupla (chave, valor) de pares clave-valor no método insert() da lista
  3. Crea un novo obxecto pasándoo ao construtor 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 a posición que se inserirá como primeiro argumento e o elemento que se inserirá como segundo argumento.

No exemplo, asígnase un novo obxecto á variable orixinal e non se engaden elementos novos ao propio obxecto orixinal.

Reorganizar (reordenar) elementos

A substitución de elementos é o mesmo proceso que no exemplo anterior.

  1. Lista os obxectos de vista que se poden obter co método items() usando list().
  2. Substituír elementos nunha lista
  3. Crea un novo obxecto pasándoo ao construtor 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)])

Se quere especificar unha clave e substituíla, use o método index() para obter o índice (posición) da lista de claves como se mostra 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 ou valor

Crea unha lista de tuplas (clave, valor) de pares clave-valor ordenados en función do obxecto de vista que se pode obter polo método items() e pásaa ao construtor collections.OrderedDict() para crear un novo obxecto.

A ordenación realízase especificando unha función anónima (expresión lambda) que devolve unha clave ou un valor dunha tupla (clave, valor) como clave de argumento da función integrada sorted().

Se queres inverter a orde, establece o argumento inverso de sorted() como verdadeiro.

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