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.
- Artigos relacionados:Engadir elementos a un dicionario e unir dicionarios en Python
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.
- Lista os obxectos de vista que se poden obter co método items() usando list().
- Engade unha tupla (chave, valor) de pares clave-valor no método insert() da lista
- 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.
- Lista os obxectos de vista que se poden obter co método items() usando list().
- Substituír elementos nunha lista
- 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)])