resueltos recorrer que lista elementos ejercicios ejemplo diccionarios diccionario dentro convertir agregar python list sorting dictionary

recorrer - Python: ordenando un diccionario de listas



que es un diccionario en python (4)

Aquí hay una manera de hacer esto:

>>> sorted(myDict.items(), key=lambda e: e[1][2]) [(''item2'', [8, 2, 3]), (''item1'', [7, 1, 9]), (''item3'', [9, 3, 11])]

El argumento key de la función sorted permite derivar una clave de clasificación para cada elemento de la lista.

Para iterar sobre las claves / valores en esta lista, puede usar algo como:

>>> for key, value in sorted(myDict.items(), key=lambda e: e[1][2]): ... print key, value ... item2 [8, 2, 3] item1 [7, 1, 9] item3 [9, 3, 11]

Todavía estoy aprendiendo pitón (¡por fin!) Y todavía no puedo entenderlo. Lo que quiero hacer es ordenar un diccionario de listas por valor utilizando el tercer elemento de la lista. Es bastante fácil clasificar un diccionario por valor cuando el valor es solo un número o cadena, pero esta cosa de la lista me tiene desconcertado.

Ejemplo:

myDict = { ''item1'' : [ 7, 1, 9], ''item2'' : [8, 2, 3], ''item3'' : [ 9, 3, 11 ] }

Quiero poder recorrer el diccionario en orden por el tercer valor en cada lista, en este caso 9, 3, 11.

¡Muchas gracias por cualquier ayuda!


Como dijo John Machlin, en realidad no se puede ordenar un diccionario de Python.

Sin embargo, puede crear un índice de las claves que se pueden ordenar en el orden que desee.

El patrón Python preferido (idioma) para clasificar por cualquier criterio alternativo se llama "decorate-sort-undecorate" (DSU). En este idioma, crea una lista temporal que contiene tuplas de sus claves seguidas por sus elementos de datos originales, luego llame al método normal .sort () en esa lista (o, en versiones más recientes de Python, simplemente ajuste su decoración en un llamado a la función incorporada ordenada () ). Luego eliminas las "decoraciones".

La razón por la que generalmente se prefiere sobrepasar la función de comparación con el método .sort () es que el código de clasificación predeterminado incorporado de Python (compilado C en el Python C normal) es muy rápido y eficiente en el caso predeterminado, pero mucho, mucho más lento cuando tiene que llamar al código objeto Python muchas, muchas veces en el caso no predeterminado. Por lo tanto, generalmente es mejor iterar sobre las estructuras de datos de creación de datos que se pueden pasar a las rutinas de clasificación predeterminadas.

En este caso, debería poder usar algo como:

[y[1] for y in sorted([(myDict[x][2], x) for x in myDict.keys()])]

... es una lista de comprensión que realiza el decodificador de la lista ordenada de tuplas que devuelve la lista de comprensión interna. La comprensión interna está creando un conjunto de tuplas, la tecla de clasificación deseada (el tercer elemento de la lista) y la tecla del diccionario correspondiente a la tecla de clasificación. myDict.keys () es, por supuesto, un método de diccionarios de Python que devuelve una lista de todas las claves válidas en el orden que elija la implementación subyacente, presumiblemente una iteración simple sobre los hash.

Una forma más detallada de hacer esto podría ser más fácil de leer:

temp = list() for k, v in myDict.items(): temp.append((v[2],)) temp.sort() results = list() for i in temp: results.append(i[1])

Por lo general, debe compilar dicho código de manera iterativa, en el intérprete utilizando muestras de datos pequeños. Desarrolle la expresión o función "decorar". Luego envuelva eso en una llamada a sorted () . Luego compila la expresión undecorate (que generalmente es tan simple como lo que he mostrado aquí).


Tarde en la fiesta y no sé si esto es lo que tenía en mente, pero puede ser útil para alguien. Si se supone que la salida es una lista:

list_third =[] for x in my_dic.keys(): list_third.append(my_dic[x][2])


Usted indicó dos deseos completamente diferentes:

  1. "Lo que quiero hacer es ordenar un diccionario de listas ..."
  2. "Quiero poder repetir el diccionario en orden de ..."

El primero de ellos es, por definición, imposible: ordenar algo implica una reorganización en algún orden. Los diccionarios de Python están inherentemente desordenados. El segundo sería vagamente posible pero muy poco probable que se implemente.

Lo que puedes hacer es

  1. Tome una copia del contenido del diccionario (que será bastante desordenado)
  2. Ordenar eso
  3. Revise los resultados ordenados, y ya tiene dos soluciones para eso. Por cierto, la solución que usa "clave" en lugar de "cmp" es mejor; ver sorted

"el tercer elemento de la lista" huele como "el tercer elemento en una tupla" para mí, y "e [1] [2]" huele a :-) ... es posible que desee investigar el uso de tuplas con nombre en lugar de listas ; ver fábrica de tuplas nombrada

Si va a hacer extract / sort / process a menudo en grandes conjuntos de datos, puede considerar algo como esto, utilizando el módulo sqlite3 suministrado por Python:

create table ex_dict (k text primary key, v0 int, v1 int, v2 int); insert into ex_dict values(''item1'', 7, 1, 9); -- etc etc select * from ex_dict order by v2;