Pregunta ¿Cómo puedo ordenar un diccionario por clave?


¿Cuál sería una buena manera de ir desde {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.


624
2018-01-25 10:54


origen


Respuestas:


Los diccionarios estándar de Python están desordenados. Incluso si ordenara los pares (clave, valor), no podría almacenarlos en un dict de una manera que preserve el orden.

La forma más fácil es usar OrderedDict, que recuerda el orden en que se insertaron los elementos:

In [1]: import collections

In [2]: d = {2:3, 1:89, 4:5, 3:0}

In [3]: od = collections.OrderedDict(sorted(d.items()))

In [4]: od
Out[4]: OrderedDict([(1, 89), (2, 3), (3, 0), (4, 5)])

No importa el camino od está impreso; Funcionará como se espera:

In [11]: od[1]
Out[11]: 89

In [12]: od[3]
Out[12]: 0

In [13]: for k, v in od.iteritems(): print k, v
   ....: 
1 89
2 3
3 0
4 5

Python 3

Para los usuarios de Python 3, uno necesita usar el .items() en lugar de .iteritems():

In [13]: for k, v in od.items(): print(k, v)
   ....: 
1 89
2 3
3 0
4 5

703
2018-01-25 10:56



Los diccionarios mismos no tienen elementos ordenados como tales, si desea imprimirlos, etc. en algún orden, aquí hay algunos ejemplos:

En Python 2.4 y superior:

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

for key in sorted(mydict):
    print "%s: %s" % (key, mydict[key])

da:

alan: 2
bob: 1
carl: 40
danny: 3

(Python debajo de 2.4 :)

keylist = mydict.keys()
keylist.sort()
for key in keylist:
    print "%s: %s" % (key, mydict[key])

Fuente: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/


344
2017-12-21 13:01



De Python collections documentación de la biblioteca:

>>> from collections import OrderedDict

>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])

168
2018-03-02 21:04



Hay una serie de módulos de Python que proporcionan implementaciones de diccionario que mantienen automáticamente las claves en orden ordenado. Considera el contenedores ordenados módulo que es pura implementación de Python y fast-as-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 al mismo tiempo que itera.

>>> from sortedcontainers import SortedDict
>>> d = {2:3, 1:89, 4:5, 3:0}
>>> s = SortedDict(d)
>>> s.items()
[(1, 89), (2, 3), (3, 0), (4, 5)]

El tipo SortedDict también admite búsquedas y eliminación de ubicaciones indexadas que no es posible con el tipo de dict incorporado.

>>> s.iloc[-1]
4
>>> del s.iloc[2]
>>> s.keys()
SortedSet([1, 2, 4])

31
2018-03-28 16:27



Simplemente:

d = {2:3, 1:89, 4:5, 3:0}
sd = sorted(d.items())

for k,v in sd:
    print k, v

Salida:

1 89
2 3
3 0
4 5

24
2017-11-12 21:28



Como otros han mencionado, los diccionarios son inherentemente desordenados. Sin embargo, si el problema es meramente mostrando diccionarios de forma ordenada, puede anular __str__ método en una subclase de diccionario, y use esta clase de diccionario en lugar de la compilación incorporada dict. P.ej.

class SortedDisplayDict(dict):
   def __str__(self):
       return "{" + ", ".join("%r: %r" % (key, self[key]) for key in sorted(self)) + "}"


>>> d = SortedDisplayDict({2:3, 1:89, 4:5, 3:0})
>>> d
{1: 89, 2: 3, 3: 0, 4: 5}

Tenga en cuenta que esto no cambia nada acerca de cómo se almacenan las claves, el orden en que volverán cuando las itere, etc., cómo se muestran con print o en la consola de python


21
2018-01-25 12:16



La forma más concisa que no se menciona en ninguna de las otras respuestas es probablemente esta:

>>> d = {2:3, 1:89, 4:5, 3:0}
>>> dict(sorted(d.items()))
{1: 89, 2: 3, 3: 0, 4: 5}

21
2017-10-30 14:33



Encontrado de otra manera:

import json
print json.dumps(d, sort_keys = True)

upd:
1. Esto también ordena objetos anidados (gracias @DanielF).
2. Los diccionarios de Python están desordenados, por lo tanto, este es sutable para imprimir o asignar a str.


13
2018-03-12 21:43