¿Cómo ordeno un diccionario por clave?

5 minutos de lectura

avatar de usuario
antonio

¿Cómo ordeno un diccionario por sus claves?

Ejemplo de entrada:

{2:3, 1:89, 4:5, 3:0}

Salida deseada:

{1:89, 2:3, 3:0, 4:5}

  • @KarlKnechtel: mi caso de uso es que tengo una aplicación CLI que tiene un menú primitivo y las opciones de menú están en un diccionario como teclas. Me gustaría mostrar las teclas en orden alfabético para la cordura del usuario.

    – Randy

    3 de junio de 2014 a las 19:53

  • posible duplicado de Dictionary en python con el orden que establecí al inicio

    – nbro

    10 de enero de 2015 a las 2:05

  • @Nayuki, dado que esta es una pregunta de Python, estaba equiparando el diccionario con dict

    -Ryan Haining

    19 de enero de 2017 a las 7:42

  • Tenga en cuenta que los dictados ahora están ordenados por orden de inserción (python 3.6+). Algunas respuestas a continuación señalan esto.

    – matiasg

    30 jun 2019 a las 21:20

  • @matiasg tenga en cuenta que en Python 3.6, los dictados que conservan el orden de inserción son un detalle de implementación de CPython. Es con Python 3.7 que la preservación del orden de inserción de dictados se convierte oficialmente en parte del lenguaje.

    – robertspierre

    25 de septiembre de 2020 a las 14:33


avatar de usuario
Jaime

Los diccionarios en sí 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 por 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/

  • También puede usar OrderedDict en python 2.4+ como en la respuesta de NPE

    – Radtek

    29 de enero de 2015 a las 22:09

  • y si está usando elementos (), puede hacerlo como for key, value in sorted(mydict.items())"

    – pitido_cheque

    4 de febrero de 2020 a las 2:07

  • Los diccionarios en sí mismos no tienen elementos ordenados como tales -> ya no es cierto!

    – minexew

    6 de abril de 2020 a las 6:46

  • ¿Cómo es que puedes explicarlo?

    – Jaime

    6 de abril de 2020 a las 9:31

  • @James Ver enlace.

    – Espacio de búsqueda

    28 de junio de 2021 a las 17:10


  • Otra forma de escribir lo mismo es usar una comprensión: {key:d[key] for key in sorted(d.keys())}

    – flujo2k

    27 de noviembre de 2019 a las 22:57


  • ¡Gran delineador! No conocía esa nueva característica. Me funciona en Centos 7 en Python 3.6.8.

    – Timmotej

    2 de junio de 2021 a las 13:19

  • Esta es una respuesta genial. Pero no intente acortarlo encerrando sorted con {} como en {sorted(d.items())}. Eso solo intentará crear un conjunto.

    – ChaimG

    1 de septiembre de 2021 a las 14:04

  • La respuesta de @flow2k (usando “comprensión”) se puede simplificar: {key:d[key] for key in sorted(d)} ya que sorted(d) devuelve una lista ordenada de claves de d

    – Julián – BrainAnnex.org

    9 oct 2021 a las 9:07

  • @Timo sorted(d.items()) devuelve un iterable al par clave y valor ordenado, no un diccionario

    – Dipu

    31 de marzo a las 22:25

avatar de usuario
dennis

De de pitón 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)])

  • ¡increíble! Chicos, si quieren invertir el orden (ascendente A descendente), simplemente agreguen reverse=True p.ej OrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0]))

    – benscabbia

    28 de agosto de 2016 a las 20:03

  • En PyCharm, no importa qué diccionario use, siempre recibo esta advertencia: Unexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])

    – Euler_Salter

    24/07/2018 a las 10:00

avatar de usuario
GrantJ

Hay una serie de módulos de Python que proporcionan implementaciones de diccionarios que mantienen automáticamente las claves ordenadas. Considera el contenedores ordenados módulo que es puro-Python e implementaciones rápidas 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 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, lo que no es posible con el tipo de dictado incorporado.

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

  • ¡increíble! Chicos, si quieren invertir el orden (ascendente A descendente), simplemente agreguen reverse=True p.ej OrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0]))

    – benscabbia

    28 de agosto de 2016 a las 20:03

  • En PyCharm, no importa qué diccionario use, siempre recibo esta advertencia: Unexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])

    – Euler_Salter

    24/07/2018 a las 10:00

avatar de usuario
usuario3769249

Simplemente:

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

for k,v in sd:
    print k, v

Producción:

1 89
2 3
3 0
4 5

  • sd es una lista de tuplas, no un diccionario. (Aunque sigue siendo útil.)

    – nischi

    24 de noviembre de 2016 a las 9:53

  • Creo que su declaración de impresión necesita (). imprimir (k,v)

    – Den Vog

    14 de agosto de 2020 a las 19:56

  • Solo necesita () para python 3. print k, v funciona bien en python 2 porque print es una palabra clave, no una función en python 2.

    – Bgil Midol

    30 de junio de 2021 a las 15:20

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad