284 votos

Python Diccionario ordenar por clave

¿Cuál sería una buena manera de pasar de esta {2:3, 1:89, 4:5, 3:0} = > {1:89, 2:3, 3:0, 4:5} .
Revisé algunos mensajes pero todos usan el operador "ordenado" que devuelve tuplas.

328voto

NPE Puntos 169956

Estándar de Python, los diccionarios son desordenadas. Incluso si usted ha ordenado la (clave,valor) pares, usted no sería capaz de 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 el que los elementos se han insertado:

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 od se imprime; que va a funcionar como se esperaba:

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

201voto

James Puntos 3068

Los diccionarios no tienen elementos ordenados como tales, en caso de que desee imprimir, etc., para algunos el fin, he aquí algunos ejemplos:

En Python 2.4 y anteriores:

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 del 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/

78voto

Dennis Puntos 5020

De 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)])

16voto

GrantJ Puntos 888

Hay un número de módulos de Python que proporcionan diccionario implementaciones que mantener automáticamente las teclas en orden. Considerar la sortedcontainers módulo que es pura Python y rápido-como-C implementaciones. También hay un rendimiento en comparación con otras opciones populares punto de referencia el uno contra el otro.

El uso de un ordenado dict es una inadecuada solución si es necesario añadir constantemente y quitar los pares clave/valor, mientras que también la iteración.

>>> 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 SortedDict tipo también admite indexado ubicación de las búsquedas y la eliminación de la cual no es posible con el built-in dict tipo.

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

11voto

Brian Puntos 48423

Como otros han mencionado, los diccionarios están intrínsecamente desordenada. Sin embargo, si el problema es simplemente mostrar los diccionarios de manera ordenada, usted puede anular la __str__ método en un diccionario de la subclase, y el uso de este diccionario clase en lugar de la incorporada dict. Por ejemplo.

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 sobre cómo se almacenan las claves, el orden en que va a volver cuando se itera sobre ellos, etc, cómo se muestran con print o en la consola de python.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X