dict mantiene el orden de inserción desde Python 3.6 (ver esto ).
OrderedDict se desarrolló solo para este propósito (antes de Python 3.6).
Desde Python 3.6, ¿el orden de las claves es siempre el mismo para dict u OrderedDict ?
Me pregunto si puedo hacer esto en mi código y tener siempre el mismo comportamiento (excepto la igualdad y algunos métodos extendidos en OrderedDict ) pero de manera más eficiente:
if sys.version_info[:2] >= (3, 6): OrderedDict = dict else: from collections import OrderedDict O expresado de manera diferente, para Python> = 3.6, ¿hay alguna razón para usar OrderedDict ?
Me doy cuenta de que el comportamiento diferente de la igualdad ( __eq__ ) puede ser en realidad una preocupación importante, por qué tal fragmento de código probablemente no sea bueno.
Sin embargo, aún podrías hacer esto:
if sys.version_info[:2] >= (3, 6): OrderedDict = dict else: from collections import OrderedDict as _OrderedDict class OrderedDict(_OrderedDict): __eq__ = dict.__eq__ __ne__ = dict.__ne__ La diferencia es que con las collections.OrderedDict originales. OrderedDict, {1:1,2:2} no es lo mismo que {2:2,1:1} , pero para dict y mi OrderedDict sobrescrito en este ejemplo, es lo mismo .
Algunos comportamientos siguen siendo los mismos, pero OrderedDict son reversibles y dict no lo son:
from collections import OrderedDict d = { "a" : 1, "c" : 2} od = OrderedDict(d.items()) print(list(reversed(od))) print(list(reversed(d)))Producción
['c', 'a'] Traceback (most recent call last): File "path/to/file", line 8, in <module> print(list(reversed(d))) TypeError: 'dict' object is not reversibleDe la documentación :
Además de los métodos de mapeo habituales, los diccionarios ordenados también admiten la iteración inversa utilizando reversed().
Tanto OrderedDict como dict están ordenados por inserción¹ para la iteración. Prácticamente no hay razón para usar OrderedDict si el orden de iteración es el único punto decisivo, especialmente si no es necesario volver a ordenar.
Obviamente, si se desea el orden de comparación , OrderedDict y dict no son intercambiables.
O expresado de manera diferente, para Python> = 3.6, ¿hay alguna razón para usar
OrderedDict?
En estos días OrderedDict es dict qué deque es list , básicamente. OrderedDict / deque se basan en listas enlazadas² mientras que dict / list se basan en matrices. Los primeros tienen mejor semántica pop/move/FIFO, ya que los elementos se pueden eliminar desde el inicio/medio sin mover otros elementos.
Dado que las matrices son generalmente muy amigables con la memoria caché, la ventaja de la lista vinculada solo entra en juego para contenedores muy grandes. Además, OrderedDict (a diferencia de deque ) no tiene garantías para la semántica de su lista enlazada y, por lo tanto, es posible que su ventaja no sea portátil. OrderedDict debe usarse principalmente si se necesitan muchas operaciones pop/move/FIFO y la evaluación comparativa puede comparar el rendimiento de dict frente a OrderedDict en la práctica.
¹Esto se aplica a todas las implementaciones admitidas actualmente que cumplen con la especificación del lenguaje Python, es decir, CPython y PyPy desde Python 3.6.
² OrderedDict en CPython aún conserva el acceso a la clave O(1). Esto se logra al tener también una tabla de búsqueda "regular", utilizando la lista vinculada para el orden entre artículos y la tabla de búsqueda para el acceso directo a artículos. Es complicado.