OrderedDict — Recuerde el orden en que las claves se agregan a un diccionario

Un OrderedDict es una subclase de diccionario que recuerdaorden en que se agregan sus contenidos

collections_ordereddict_iter.py
import collections

print('Regular dictionary:')
d = {}
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'

for k, v in d.items():
    print(k, v)

print('\nOrderedDict:')
d = collections.OrderedDict()
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'

for k, v in d.items():
    print(k, v)

Un dict regular no rastrea el orden de inserción, e iterando sobre él produce los valores en orden en función de cómo las llaves see almacenan en la tabla hash, que a su vez está influenciada por un valor aleatorio para reducir las colisiones. En un OrderedDict, por el contrario, el orden en que se insertan los elementos se recuerda y se usa al crea run iterador.

$ python3 collections_ordereddict_iter.py

Regular dictionary:
c C
b B
a A

OrderedDict:
a A
b B
c C

Igualdad

Un dict regular mira su contenido cuando prueba la igualdad. Un OrderedDict también considera el orden en que los artículos fueron añadidos.

collections_ordereddict_equality.py
import collections

print('dict       :', end=' ')
d1 = {}
d1['a'] = 'A'
d1['b'] = 'B'
d1['c'] = 'C'

d2 = {}
d2['c'] = 'C'
d2['b'] = 'B'
d2['a'] = 'A'

print(d1 == d2)

print('OrderedDict:', end=' ')

d1 = collections.OrderedDict()
d1['a'] = 'A'
d1['b'] = 'B'
d1['c'] = 'C'

d2 = collections.OrderedDict()
d2['c'] = 'C'
d2['b'] = 'B'
d2['a'] = 'A'

print(d1 == d2)

En este caso, dado que los dos diccionarios ordenados se crean a partir de valores en un orden diferente, se consideran diferentes.

$ python3 collections_ordereddict_equality.py

dict       : True
OrderedDict: False

Reordenando

Es posible cambiar el orden de las llaves en un OrderedDict moviéndolos al comienzo o al final de la secuencia usando move_to_end().

collections_ordereddict_move_to_end.py
import collections

d = collections.OrderedDict(
    [('a', 'A'), ('b', 'B'), ('c', 'C')]
)

print('Before:')
for k, v in d.items():
    print(k, v)

d.move_to_end('b')

print('\nmove_to_end():')
for k, v in d.items():
    print(k, v)

d.move_to_end('b', last=False)

print('\nmove_to_end(last=False):')
for k, v in d.items():
    print(k, v)

El argumento last dice a move_to_end() si mover el elemento para ser el último elemento en la secuencia de llaves (cuando es True) o el primero (cuando es False).

$ python3 collections_ordereddict_move_to_end.py

Before:
a A
b B
c C

move_to_end():
a A
c C
b B

move_to_end(last=False):
b B
a A
c C

Ver también

  • PYTHONHASHSEED – Variable de entorno para controlar el valor de inicialización aleatorio para el algoritmo hash para las ubicaciones clave en el diccionario.