2012-06-06 20 views
5

tengo la siguiente lista de diccionariosOrdenar una lista de dicts por dict valores

a = [{23:100}, {3:103}, {2:102}, {36:103}, {43:123}] 

¿Cómo puedo solucionar el problema de conseguir:

a = [{43:123}, {3:103}, {36:103}, {2:102}, {23:100}] 

Es decir, para ordenar la lista por sus dicts 'valores, en orden descendente.

+0

Cada uno de los diccionarios tienen diferentes claves. ¿Hay un mejor tipo de datos para esto? – tlunter

Respuesta

1

Usted puede pasar un parámetro key al método list.sort(), por lo que la comparación se hará en función del valor de retorno de key:

>>> a = [{23:100}, {3:103}, {2:102}, {36:103}, {43:123}] 
>>> a.sort(key=lambda d: d.values()[0], reversed=True) 
>>> a 
[{23: 100}, {2: 102}, {3: 103}, {36: 103}, {43: 123}] 

En este caso, la clave es una función que recibe un diccionario d y obtiene una lista de su valor con .values(). Como solo hay un valor, obtenemos este único valor de la lista devuelta. Luego, el método list.sort() comparará los valores devueltos, en lugar de los diccionarios mismos, al ordenar.

+0

Esto da un orden en orden creciente, el OP quería disminuir. – raym0nd

+2

@ raym0nd bien, reparado, aunque debería decir que preferiría la solución HodfHod de todos modos :) – brandizzi

3
>>> sorted(a, key=lambda i: i.values()[0], reverse=True) 
[{43: 123}, {3: 103}, {36: 103}, {2: 102}, {23: 100}] 
6

Además de la respuesta de Brandizzi, usted podría ir con:

sorted(a, key=dict.values, reverse=True) 

Más o menos lo mismo, pero posiblemente más idiomática.

+0

+1 Acepto, esta es la mejor respuesta a menos que la pregunta especifique que solo se use el primer elemento para el género. – jamylak

+0

hey, ¿cómo puedo extraer el valor de 'a' dict ordenado para recive int? p. ' de b en una: de impresión a [i] .keys() i + = 1' pero pitón dice que es todavía una lista, tengo que recive int. Cómo puedo hacerlo ? – user1403568

+0

@ user1403568 intente 'for b in a: print b.keys() [0]'. que extraerá las claves, por lo que terminará imprimiendo: 43, 3, 36, 2, 23. Si desea valores en su lugar (como 123,103,36,102,100), use 'b.values ​​() [0]'. – HodofHod

0

prefiero usar (o al menos tener en cuenta) .itervalues()

In [25]: sorted(a, key=lambda x: x.itervalues().next, reverse=True) 
Out[25]: [{43: 123}, {36: 103}, {2: 102}, {23: 100}, {3: 103}] 
Cuestiones relacionadas