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





12 Answers

Los diccionarios en sí no tienen elementos ordenados como tales, si desea imprimirlos, etc., por favor, 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/

python sorting dictionary

¿Cuál sería una buena manera de pasar 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 las tuplas.




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}



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



Encontré otra manera:

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

actualizacion:
1. Esto también ordena los objetos anidados (gracias @DanielF).
2. Los diccionarios de Python no están ordenados, por lo tanto, esto es sutable para imprimir o asignar solo a str.




Aquí encontré la solución más sencilla para ordenar el pprint Python por clave usando pprint . p.ej.

>>> x = {'a': 10, 'cd': 20, 'b': 30, 'az': 99} 
>>> print x
{'a': 10, 'b': 30, 'az': 99, 'cd': 20}

pero mientras usa pprint, regresará ordenado dict

>>> import pprint 
>>> pprint.pprint(x)
{'a': 10, 'az': 99, 'b': 30, 'cd': 20}



Hay una manera fácil de ordenar un diccionario.

Según su pregunta,

La solucion es :

c={2:3, 1:89, 4:5, 3:0}
y=sorted(c.items())
print y

(Donde c, es el nombre de su diccionario.)

Este programa da la siguiente salida:

[(1, 89), (2, 3), (3, 0), (4, 5)]

como tu querias

Otro ejemplo es:

d={"John":36,"Lucy":24,"Albert":32,"Peter":18,"Bill":41}
x=sorted(d.keys())
print x

Da la salida: ['Albert', 'Bill', 'John', 'Lucy', 'Peter']

y=sorted(d.values())
print y

Da la salida: [18, 24, 32, 36, 41]

z=sorted(d.items())
print z

Da la salida:

[('Albert', 32), ('Bill', 41), ('John', 36), ('Lucy', 24), ('Peter', 18)]

Por lo tanto, al cambiarlo en claves, valores y elementos, puede imprimir como lo que deseaba. ¡Espero que esto ayude!




Generará exactamente lo que quieres:

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

 sort_dic = {}

 for i in sorted(D1):
     sort_dic.update({i:D1[i]})
 print sort_dic


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

Pero esta no es la forma de escritura para hacer esto, porque podría mostrar un comportamiento distinto con diferentes diccionarios, que he aprendido recientemente. Por lo tanto, Tim sugirió la manera perfecta en la respuesta de mi consulta que estoy compartiendo aquí.

from collections import OrderedDict
sorted_dict = OrderedDict(sorted(D1.items(), key=lambda t: t[0]))



Puede crear un nuevo diccionario clasificando el diccionario actual por clave según su pregunta.

Este es tu diccionario

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

Crea un nuevo diccionario d1 ordenando este d usando la función lambda

d1 = dict(sorted(d.items(), key = lambda x:x[0]))

d1 debe ser {1: 89, 2: 3, 3: 0, 4: 5}, ordenados según las claves en d.




Una comparación de tiempo de los dos métodos en 2.7 muestra que son prácticamente idénticos:

>>> setup_string = "a = sorted(dict({2:3, 1:89, 4:5, 3:0}).items())"
>>> timeit.timeit(stmt="[(k, val) for k, val in a]", setup=setup_string, number=10000)
0.003599141953657181

>>> setup_string = "from collections import OrderedDict\n"
>>> setup_string += "a = OrderedDict({1:89, 2:3, 3:0, 4:5})\n"
>>> setup_string += "b = a.items()"
>>> timeit.timeit(stmt="[(k, val) for k, val in b]", setup=setup_string, number=10000)
0.003581275490432745 



La solución más sencilla es que usted debe obtener una lista de las claves de dictado, ordenadas y luego iteradas sobre dict. Por ejemplo

a1 = {'a':1, 'b':13, 'd':4, 'c':2, 'e':30}
a1_sorted_keys = sorted(a1, key=a1.get, reverse=True)
for r in a1_sorted_keys:
    print r, a1[r]

A continuación se mostrará la salida (orden pendiente).

e 30
b 13
d 4
c 2
a 1



O utilizar pandas ,

Manifestación:

>>> d={'B':1,'A':2,'C':3}
>>> df=pd.DataFrame(d,index=[0]).sort_index(axis=1)
   A  B  C
0  2  1  3
>>> df.to_dict('int')[0]
{'A': 2, 'B': 1, 'C': 3}
>>> 

Ver:

Docs de esto

Documentación de pandas enteros.




Si tienes un dict, por ejemplo:

not_ordered_dict = {5 : "5555", 9 : "9999", 1 : "1111"}

ordered_dict = {}

for key in sorted(not_ordered_dict):
    ordered_dict[key] = not_ordered_dict[key]   





Related