¿Cuál sería una buena manera de ir de {2:3, 1:89, 4:5, 3:0}
a {1:89, 2:3, 3:0, 4:5}
?
Revisé algunas publicaciones pero todas usan el operador "ordenado" que devuelve tuplas.
python
sorting
dictionary
Antonio
fuente
fuente
Respuestas:
Los diccionarios estándar de Python no están ordenados. Incluso si clasificara los pares (clave, valor), no podría almacenarlos
dict
de una manera que preservara el orden.La forma más fácil es usar
OrderedDict
, que recuerda el orden en que se han insertado los elementos:No importa cómo
od
se imprima el camino; funcionará como se esperaba:Python 3
Para los usuarios de Python 3, uno debe usar el en
.items()
lugar de.iteritems()
:fuente
sorted_dict = dict(sorted(unsorted_dict.items()))
Los diccionarios en sí no tienen elementos ordenados como tales, si desea imprimirlos, etc. en algún orden, aquí hay algunos ejemplos:
En Python 2.4 y superior:
da:
(Python debajo de 2.4 :)
Fuente: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/
fuente
for key, value in sorted(mydict.items())"
De la
collections
documentación de la biblioteca de Python :fuente
reverse=True
por ejemploOrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0]))
Unexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
Para CPython / PyPy 3.6, y cualquier Python 3.7 o superior, esto se hace fácilmente con:
fuente
{key:d[key] for key in sorted(d.keys())}
Hay varios módulos de Python que proporcionan implementaciones de diccionario que mantienen automáticamente las claves en orden ordenado. Considere el módulo sortedcontainers que es implementaciones de Python puro y rápido como C. También hay una comparación de rendimiento con otras opciones populares comparadas entre sí.
El uso de un dict ordenado es una solución inadecuada si necesita agregar y eliminar constantemente pares clave / valor mientras itera.
El tipo SortedDict también admite búsquedas de ubicación indexadas y eliminación, lo que no es posible con el tipo dict incorporado.
fuente
Simplemente:
Salida:
fuente
sd
es una lista de tuplas, no un diccionario. (aunque útil.)Como otros han mencionado, los diccionarios son inherentemente desordenados. Sin embargo, si el problema es simplemente mostrar los diccionarios de forma ordenada, puede anular el
__str__
método en una subclase de diccionario y utilizar esta clase de diccionario en lugar de la incorporadadict
. P.ej.Tenga en cuenta que esto no cambia nada sobre cómo se almacenan las claves, el orden en que volverán cuando las repita, etc., solo cómo se muestran con
print
o en la consola de Python.fuente
Encontrado otra forma:
upd:
1. esto también clasifica los objetos anidados (gracias @DanielF).
2. los diccionarios de python no están ordenados, por lo tanto, esto es adecuado para imprimir o asignar solo a str.
fuente
En Python 3.
da
fuente
El diccionario de Python no estaba ordenado antes de Python 3.6. En la implementación CPython de Python 3.6, el diccionario mantiene el orden de inserción. Desde Python 3.7, esto se convertirá en una característica del lenguaje.
En el registro de cambios de Python 3.6 ( https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-compactdict ):
En el documento de Python 3.7 ( https://docs.python.org/3.7/tutorial/datastructures.html#dictionaries ):
Entonces, a diferencia de las versiones anteriores, puede ordenar un dict después de Python 3.6 / 3.7. Si desea ordenar un dict anidado incluyendo el sub-dict dentro, puede hacer:
https://gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb
fuente
Aquí encontré una solución más simple para ordenar el dict de Python por clave usando
pprint
. p.ej.pero mientras usa pprint devolverá dict ordenado
fuente
Hay una manera fácil de ordenar un diccionario.
De acuerdo a su pregunta,
La solucion es :
(Donde c, es el nombre de su diccionario).
Este programa da el siguiente resultado:
como quisieras
Otro ejemplo es:
Da la salida:
['Albert', 'Bill', 'John', 'Lucy', 'Peter']
Da la salida:
[18, 24, 32, 36, 41]
Da la salida:
Por lo tanto, al cambiarlo por claves, valores y elementos, puede imprimir como deseaba. ¡Espero que esto ayude!
fuente
Generará exactamente lo que quieres:
Pero esta no es la forma correcta de hacer esto, porque podría mostrar un comportamiento distinto con diferentes diccionarios, lo que he aprendido recientemente. Por lo tanto, Tim sugirió la manera perfecta en la respuesta de mi consulta que estoy compartiendo aquí.
fuente
Creo que lo más fácil es ordenar el dict por clave y guardar la clave ordenada: par de valores en un nuevo dict.
Para hacerlo más claro:
fuente
Puede crear un nuevo diccionario clasificando el diccionario actual por clave según su pregunta.
Este es tu diccionario
Cree un nuevo diccionario d1 ordenando este d usando la función lambda
d1 debe ser {1: 89, 2: 3, 3: 0, 4: 5}, ordenados según las claves en d.
fuente
Los dictados de Python no están ordenados. Por lo general, esto no es un problema ya que el caso de uso más común es hacer una búsqueda.
La forma más sencilla de hacer lo que desea sería crear una
collections.OrderedDict
inserción de los elementos en orden ordenado.Si necesita iterar, como han sugerido los anteriores, la forma más sencilla sería iterar sobre las teclas ordenadas. Ejemplos
Imprimir valores ordenados por claves:
Obtenga una lista de valores ordenados por claves:
fuente
for k,value in sorted(d.items()):
es mejor: evita acceder al dict por clave nuevamente en el bucleSe me ocurre una sola línea de clasificación de dict.
Esperamos que esto sea útil.
fuente
Esta función clasificará cualquier diccionario de forma recursiva por su clave. Es decir, si cualquier valor en el diccionario también es un diccionario, también se ordenará por su clave. Si está ejecutando en CPython 3.6 o superior, se puede hacer un cambio simple para usar un en
dict
lugar de unOrderedDict
.fuente
Chicos, ustedes están complicando las cosas ... es muy simple
El resultado es:
fuente
La solución más simple es que debe obtener una lista de la clave dict ordenada y luego iterar sobre dict. Por ejemplo
A continuación se mostrará la salida (orden de finalización)
fuente
Una manera fácil de hacer esto:
fuente
Una comparación temporal de los dos métodos en 2.7 muestra que son prácticamente idénticos:
fuente
fuente
fuente
O usar
pandas
,Manifestación:
Ver:
fuente
Mi sugerencia es esta, ya que le permite ordenar un dict o mantener un dict ordenado a medida que agrega elementos y podría necesitar agregar elementos en el futuro:
Construye una
dict
desde cero a medida que avanzas. Tenga una segunda estructura de datos, una lista, con su lista de claves. El paquete bisect tiene una función de inserción que permite insertar en una lista ordenada u ordenar su lista después de completar completamente su dict. Ahora, cuando itera sobre su dict, en su lugar itera sobre la lista para acceder a cada clave de manera ordenada sin preocuparse por la representación de la estructura de dict (que no fue hecha para ordenar).fuente
Para la forma en que se formula la pregunta, la mayoría de las respuestas aquí son contestarla correctamente.
Sin embargo, considerando cómo se deben hacer realmente las cosas , teniendo en cuenta décadas y décadas de informática, me sorprende totalmente que en realidad solo haya una respuesta aquí (de GrantJ usuario de ) que sugiera el uso de contenedores asociativos ordenados (contenedores ordenados) que ordena los elementos según la clave en su punto de inserción.
Eso evitará un impacto masivo en el rendimiento por cada llamada de
sort(...)
(como mínimoO(N*log(N))
, dondeN
hay una cantidad de elementos (lógicamente, esto se aplica a todas las soluciones aquí que sugieren usar elsort(...)
). Tenga en cuenta que para todas esas soluciones,sort(...)
será necesario se llamará cada vez que se deba acceder a la colección ordenada DESPUÉS de que se modificó agregando / eliminando elementos ...fuente
fuente