2010-05-20 9 views
16

que tienen una lista de diccionarios:Ordenar una lista de valores predice por dict

[{'title':'New York Times', 'title_url':'New_York_Times','id':4}, 
{'title':'USA Today','title_url':'USA_Today','id':6}, 
{'title':'Apple News','title_url':'Apple_News','id':2}] 

me gustaría a solucionar el problema por el título, por lo que los elementos con un ir antes de la Z:

[{'title':'Apple News','title_url':'Apple_News','id':2}, 
{'title':'New York Times', 'title_url':'New_York_Times','id':4}, 
{'title':'USA Today','title_url':'USA_Today','id':6}] 

¿Cuál es la mejor manera de hacer esto? Además, ¿hay alguna forma de garantizar que el orden de cada clave de diccionario permanezca constante, por ejemplo, siempre título, argumento_url, y luego id?

+0

¿Puedo preguntar por qué es necesario un dict ordenado? Normalmente está accediendo a un dict mediante claves de todos modos, por lo que el orden no importa. –

+3

Er, es una lista de los dictados de Félix. – Amber

+0

@Amber: Sí, ya veo ... pero de todos modos su segunda pregunta está dirigida a esto;) –

Respuesta

2

Llame a .sort(fn) en la lista, donde fn es una función que compara los valores del título y devuelve el resultado de la comparación.

mylist.sort(lambda x,y: cmp(x['title'], y['title'])) 

En versiones posteriores de Python, aunque (2.4+), que es mucho mejor que sólo tiene que utilizar una clave de clasificación:

mylist.sort(key=lambda x:x['title']) 

También, los diccionarios están garantizados para mantener su orden, fueron iterar a través de claves/valores, siempre que no haya más adiciones/eliminaciones. Sin embargo, si agrega o quita elementos, todas las apuestas están desactivadas, no hay garantía de eso.

-1
originalList.sort(lambda d1, d2: cmp(d1['title'], d2['title'])) 

Aunque esto solo depende del título y el orden después de eso no está definido. Hacer varios niveles sería doloroso de esta manera.

+2

'cmp' está en desuso con buena razón como 'clave' es mucho mejor. Clasificar en múltiples niveles es fácil: solo use tuplas, vea la respuesta de Kenny –

+1

El orden posterior se define como el orden en que se produjeron originalmente. (Los géneros Python son estables.) –

17
l.sort(key=lambda x:x['title']) 

Para ordenar con múltiples teclas, suponiendo que todo en orden ascendente:

l.sort(key=lambda x:(x['title'], x['title_url'], x['id'])) 
+2

+1, usando 'key' y tirando del atributo correcto es más correcto/más limpio que usar' lambda' como la función de ordenación –

+2

Sí, eso también lo recordé - Python 2.4+ tiene ellos, entonces probablemente estén disponibles. – Amber

19

La alternativa hipoalergénica para los que estornudar al ser abordados por lambdas:

import operator 
L.sort(key=operator.itemgetter('title','title_url','id')) 
Cuestiones relacionadas