¿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}
?
He revisado algunos posts pero todos utilizan el operador "sorted" que devuelve tuplas.
Los diccionarios estándar de Python no están ordenados. Incluso si ordenas los pares (clave,valor), no podrás almacenarlos en un dict
de forma que se conserve el orden.
La forma más sencilla es utilizar OrderedDict
, que recuerda el orden en que se han insertado 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 la forma en que se imprima od
; 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
Para los usuarios de Python 3, hay que utilizar .items()
en lugar de .iteritems()
:
In [13]: for k, v in od.items(): print(k, v)
....:
1 89
2 3
3 0
4 5
Los diccionarios en sí mismos no tienen elementos ordenados como tales, en caso de que quiera imprimirlos, etc. con 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/
Como otros han mencionado, los diccionarios son inherentemente desordenados. Sin embargo, si el problema es simplemente representar los diccionarios de forma ordenada, puede anular el método __str__
en una subclase de diccionario, y utilizar esta clase de diccionario en lugar del construido dict
. 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 el que volverán al iterar sobre ellas, etc, sólo cómo se muestran con print
o en la consola de python.