2011-11-07 20 views
37

Estoy tratando de ordenar OrderedDict en OrderedDict por 'profundidad' clave. ¿Hay alguna solución para ordenar ese diccionario?Cómo ordenar OrderedDict de OrderedDict - Python

OrderedDict([ 
    (2, OrderedDict([ 
    ('depth', 0), 
    ('height', 51), 
    ('width', 51), 
    ('id', 100) 
    ])), 
    (1, OrderedDict([ 
    ('depth', 2), 
    ('height', 51), 
    ('width', 51), 
    ('id', 55) 
    ])), 
    (0, OrderedDict([ 
    ('depth', 1), 
    ('height', 51), 
    ('width', 51), 
    ('id', 48) 
    ])), 
]) 

dict Ordenado debería tener este aspecto:

OrderedDict([ 
    (2, OrderedDict([ 
    ('depth', 0), 
    ('height', 51), 
    ('width', 51), 
    ('id', 100) 
    ])), 
    (0, OrderedDict([ 
    ('depth', 1), 
    ('height', 51), 
    ('width', 51), 
    ('id', 48) 
    ])), 
    (1, OrderedDict([ 
    ('depth', 2), 
    ('height', 51), 
    ('width', 51), 
    ('id', 55) 
    ])), 
]) 

alguna idea de cómo conseguirlo?

Respuesta

67

Tendrá que crear uno nuevo ya que OrderedDict está ordenado por orden de inserción.

En su caso el código se vería así:

foo = OrderedDict(sorted(foo.iteritems(), key=lambda x: x[1]['depth'])) 

Ver http://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes para más ejemplos.

+2

Esto causará una excepción si algún dict no tiene 'profundidad' como clave. Esto podría ser deseado. Si no es así, puede asumir una clave predeterminada utilizando "get". – TomOnTime

+5

Tenga en cuenta que '[1]' aquí se refiere a los valores de foo, a diferencia de sus claves, que serían '[0]' – emisilva

15
>>> OrderedDict(sorted(od.items(), key=lambda item: item[1]['depth'])) 
Cuestiones relacionadas