2010-12-02 18 views

Respuesta

17

dict s no están pedidos. Así que no hay manera de ordenar directamente, pero si usted está dispuesto a convertir el dict en una lista de (clave, valor) -tuplas, entonces usted podría hacer esto:

In [9]: d 
Out[9]: {'a': {'b': 'whatever', 'k': 1}, 'b': {'b': 'sort by k', 'k': 2}} 

In [15]: sorted(d.items(),key=lambda x: x[1]['k'],reverse=True) 
Out[15]: [('b', {'b': 'sort by k', 'k': 2}), ('a', {'b': 'whatever', 'k': 1})] 

Esto explica el uso excellent mini-howto del parámetro key.

+2

¿Puedes explicar 'x [1] ['k']'? Entiendo la parte ['k'], pero ¿qué es x [1]? – user225312

+0

dice que el objeto de la lista no se puede llamar? – user469652

+2

@A: 'dict.items()' devuelve una lista de 2 tuplas de (clave, valor). –

1

Los diccionarios no están "ordenados". Ese no es un concepto significativo. Las claves y los valores no están, conceptualmente, en ningún "orden", por lo que no puede cambiar el orden en el que están.

+0

Sí, pero podemos convertir i t en otro tipo de secuencia y ordene y vuelva a convertirlo en diccionario. – user469652

+4

@ user469652: en ese momento ya no serán ordenados. –

4

Utilice OrderedDict, si utiliza python 2.7 o posterior.

Los diccionarios ordenados son como los diccionarios comunes pero recuerdan el orden en que se insertaron los elementos. Al iterar sobre un diccionario ordenado, los elementos se devuelven en el orden en que se agregaron sus claves por primera vez.

A partir del ejemplo

>>> # regular unsorted dictionary 
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} 

>>> # dictionary sorted by key 
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0])) 
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) 

Para tratar de lograr algo del mismo efecto para Python 2.4 o inferior, ver:

Un desplegable en sustitución de las nuevas colecciones de Py2.7. OrderedDict que funciona en Python 2.4 -2.6.

+0

Estoy en Python 2.6 .... – user469652

+0

@ user469652: He agregado el enlace a pypi o la receta que lo emula y funcionará con python 2.6 – pyfunc

0

Si usted tiene un diccionario (datos) con sub-diccionarios (D1 y D2) que contiene un valor (v) y la prioridad (p), si queremos ordenar el diccionario de la intención de la iteración en que luego luego se puede hacer esto:

data = { "d1": { "v": "hello", "p": 3}, "d2": {"v": "hi again", "p": 1},} 

for item in sorted(data.keys(), key=lambda x: data[x]['p']): 
    print item 
0
from collections import OrderedDict 
from operator import * 

d = { 'a':{'k':1, 'b':'whatever'}, 'b':{'k':2, 'b':'sort by k'} } 
sorted_d = OrderedDict(sorted(d.items(), key=lambda x: getitem(x[1], 'k'))) 
Cuestiones relacionadas