A partir de Python 3.6 , se ordenará el dict incorporado
Buenas noticias, por lo que el caso de uso original del OP de pares de mapeo recuperados de una base de datos con identificadores de cadena únicos como claves y valores numéricos como valores en un Python v3.6 + dict incorporado, ahora debe respetar el orden de inserción.
Si dice las expresiones de tabla de dos columnas resultantes de una consulta de base de datos como:
SELECT a_key, a_value FROM a_table ORDER BY a_value;
se almacenaría en dos tuplas de Python, k_seq y v_seq (alineadas por índice numérico y con la misma longitud de curso), luego:
k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))
Permitir la salida más tarde como:
for k, v in ordered_map.items():
print(k, v)
cediendo en este caso (¡para el nuevo dict incorporado de Python 3.6+!):
foo 0
bar 1
baz 42
en el mismo orden por valor de v.
Donde en la instalación de Python 3.5 en mi máquina actualmente produce:
bar 1
foo 0
baz 42
Detalles:
Según lo propuesto en 2012 por Raymond Hettinger (cf. mail en python-dev con asunto "Diccionarios más compactos con iteración más rápida" ) y ahora (en 2016) anunciado en un correo de Victor Stinner a python-dev con asunto "Python 3.6 dict se convierte en compacto y obtiene una versión privada, y las palabras clave se ordenan " debido a la solución / implementación del problema 27350 " Dict compacto y ordenado " en Python 3.6 ahora podremos usar un dict incorporado para mantener el orden de inserción !!
Esperemos que esto conduzca a una implementación de OrderedDict de capa delgada como primer paso. Como indicó @ JimFasarakis-Hilliard, algunos ven casos de uso para el tipo OrderedDict también en el futuro. Creo que la comunidad de Python en general inspeccionará cuidadosamente, si esto resistirá la prueba del tiempo, y cuáles serán los próximos pasos.
Es hora de repensar nuestros hábitos de codificación para no perder las posibilidades abiertas por un ordenamiento estable de:
- Argumentos de palabras clave y
- (intermedio) almacenamiento dict
La primera porque facilita el despacho en la implementación de funciones y métodos en algunos casos.
El segundo, ya que alienta a usar más fácilmente dict
s como almacenamiento intermedio en las tuberías de procesamiento.
Raymond Hettinger proporcionó amablemente documentación que explicaba " Los Diccionarios de Tech Behind Python 3.6 " - de su presentación del Grupo Meetup de San Francisco Python 2016-DIC-08.
Y tal vez algunas páginas de preguntas y respuestas altamente decoradas de Stack Overflow recibirán variantes de esta información y muchas respuestas de alta calidad requerirán también una actualización por versión.
Caveat Emptor (pero también vea la actualización a continuación 2017-12-15):
Como @ajcr señala correctamente: "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". (desde el whatsnew36 ) no pellizca , pero la cita fue cortada un poco pesimista ;-). Continúa como "(esto puede cambiar en el futuro, pero se desea tener esta nueva implementación de dict en el idioma durante algunos lanzamientos antes de cambiar la especificación del idioma para exigir 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 todavía está vigente, por ejemplo, Python 3.5) ".
Entonces, como en algunos idiomas humanos (por ejemplo, alemán), el uso da forma al idioma, y la voluntad ahora se ha declarado ... en whatsnew36 .
Actualización 2017-12-15:
En un correo a la lista python-dev , Guido van Rossum declaró:
Hazlo así. "Dict mantiene orden de inserción" es el fallo. ¡Gracias!
Entonces, el efecto secundario de la versión 3.6 CPython del orden de inserción dict ahora se está convirtiendo en parte de la especificación del lenguaje (y ya no es solo un detalle de implementación). Ese hilo de correo también surgió algunos objetivos de diseño distintivos collections.OrderedDict
como lo recordó Raymond Hettinger durante la discusión.