in

python: ¿cómo clasifico un diccionario por valor?

apple touch icon@2

Buenas noticias, por lo que el caso de uso original del OP de mapeo de pares recuperados de una base de datos con identificadores de cadena únicos como claves y valores numéricos como valores en un dictado de Python v3.6 + incorporado, ahora debería 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 por supuesto), entonces:

k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))

Permitir que se genere más tarde como:

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

ceder en este caso (¡para el nuevo diccionario 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 el asunto «El diccionario de Python 3.6 se vuelve compacto y obtiene una versión privada; y las palabras clave se ordenan» debido a la corrección / implementación del problema 27350 «Dict compacto y ordenado» en Python 3.6 ahora podremos usar un dictado incorporado para mantener el orden de inserción.

Con suerte, esto conducirá 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 que abre el ordenamiento estable de:

  • Argumentos de palabras clave y
  • almacenamiento de dict (intermedio)

La primera porque facilita el despacho en la implementación de funciones y métodos en algunos casos.

El segundo ya que anima a usar más fácilmente dicts como almacenamiento intermedio en tuberías de procesamiento.

Raymond Hettinger brindó amablemente documentación que explica «La tecnología detrás de los diccionarios de Python 3.6«- de su presentación de San Francisco Python Meetup Group 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 también requerirán una actualización por versión.

Caveat Emptor (pero también vea la siguiente actualización 2017-12-15):

Como @ajcr señala con razó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». (desde el whatsnew36) no recoger liendres, 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 lenguaje para algunas versiones antes de cambiar la especificación del lenguaje 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 aleatorio todavía está vigente, por ejemplo, Python 3.5) «.

Entonces, como en algunos lenguajes humanos (por ejemplo, alemán), el uso da forma al lenguaje, y la voluntad ahora ha sido declarada … en whatsnew36.

Actualización 2017-12-15:

en un correo a la lista de python-dev, Guido van Rossum declaró:

Hazlo así. «Dict mantiene el orden de inserción» es la sentencia. ¡Gracias!

Por lo tanto, el efecto secundario de CPython de la versión 3.6 del orden de inserción de 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 mostró algunos objetivos de diseño distintivos para collections.OrderedDict como lo recordó Raymond Hettinger durante la discusión.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

R – Funciones

gfg 200x200 min

comando cp en Linux con ejemplos