Desde Python 3.6 en adelante, el dict
tipo estándar mantiene el orden de inserción por defecto.
Definiendo
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
dará como resultado un diccionario con las claves en el orden indicado en el código fuente.
Esto se logró mediante el uso de una matriz simple con enteros para la tabla hash dispersa, donde esos enteros se indexan en otra matriz que almacena los pares clave-valor (más el hash calculado). Esa última matriz simplemente almacena los elementos en orden de inserción, y toda la combinación en realidad usa menos memoria que la implementación utilizada en Python 3.5 y anteriores. Vea la idea original publicada por Raymond Hettinger para más detalles.
En 3.6 esto todavía se consideraba un detalle de implementación; ver el Novedades de Python 3.6 documentación :
El aspecto de preservación del orden de esta nueva implementación se considera un detalle de implementación y no se debe confiar en él (esto puede cambiar en el futuro, pero se desea tener esta nueva implementación dict en el idioma durante algunas versiones antes de cambiar la especificación del idioma para ordenar la semántica de preservación del orden para todas las implementaciones actuales y futuras de Python; esto también ayuda a preservar la compatibilidad con versiones anteriores del lenguaje donde el orden de iteración aleatoria aún está vigente, por ejemplo, Python 3.5).
Python 3.7 eleva este detalle de implementación a una especificación de lenguaje , por lo que ahora es obligatorio que dict
conserve el orden en todas las implementaciones de Python compatibles con esa versión o más nuevas. Ver el pronunciamiento de la BDFL .
Es posible que aún desee utilizar la collections.OrderedDict()
clase en ciertos casos, ya que ofrece algunas funcionalidades adicionales además del dict
tipo estándar . Como ser reversible (esto se extiende a los objetos de vista ) y admitir la reordenación (a través del move_to_end()
método ).