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
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.
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()
.
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.