Pregunta ¿Cómo ordeno una lista de diccionarios por valores del diccionario en Python?


Obtuve una lista de diccionarios y quiero que se ordene por un valor de ese diccionario.

Esta

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

ordenados por nombre, deberían convertirse

[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]

1340
2017-09-16 14:39


origen


Respuestas:


Puede parecer más limpio usando una clave en lugar de un cmp:

newlist = sorted(list_to_be_sorted, key=lambda k: k['name']) 

o como J.F.Sebastian y otros sugirieron,

from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name')) 

Para completar (como se señala en los comentarios de fitzgeraldsteele), agregue reverse=True ordenar descendente

newlist = sorted(l, key=itemgetter('name'), reverse=True)

1818
2017-09-16 15:18



import operator

Para ordenar la lista de diccionarios por clave = 'nombre':

list_of_dicts.sort(key=operator.itemgetter('name'))

Para ordenar la lista de diccionarios por clave = 'edad':

list_of_dicts.sort(key=operator.itemgetter('age'))

109
2017-09-16 14:39



Si desea ordenar la lista por varias teclas, puede hacer lo siguiente:

my_list = [{'name':'Homer', 'age':39}, {'name':'Milhouse', 'age':10}, {'name':'Bart', 'age':10} ]
sortedlist = sorted(my_list , key=lambda elem: "%02d %s" % (elem['age'], elem['name']))

Es bastante hackish, ya que depende de convertir los valores en una sola representación de cadena para la comparación, pero funciona como se espera para los números, incluidos los negativos (aunque tendrá que formatear la cadena adecuadamente con cero acolchados si está usando números)


39
2017-09-16 14:43



my_list = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

my_list.sort(lambda x,y : cmp(x['name'], y['name']))

my_list ahora será lo que quieras.

(3 años después) Editado para agregar:

El nuevo key el argumento es más eficiente y más ordenado. Una mejor respuesta ahora se ve así:

my_list = sorted(my_list, key=lambda k: k['name'])

... la lambda es, IMO, más fácil de entender que operator.itemgetter, pero YMMV.


27
2017-09-16 14:36



import operator
a_list_of_dicts.sort(key=operator.itemgetter('name'))

'key' se usa para ordenar por un valor arbitrario y 'itemgetter' establece ese valor para el atributo 'name' de cada elemento.


20
2017-09-16 14:52



Supongo que has querido decir:

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

Esto se ordenaría de esta manera:

sorted(l,cmp=lambda x,y: cmp(x['name'],y['name']))

14
2017-09-16 14:31



Podría usar una función de comparación personalizada o podría pasar una función que calcule una clave de clasificación personalizada. Suele ser más eficiente ya que la clave solo se calcula una vez por artículo, mientras que la función de comparación se llamaría muchas veces más.

Podrías hacerlo de esta manera:

def mykey(adict): return adict['name']
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=mykey)

Pero la biblioteca estándar contiene una rutina genérica para obtener elementos de objetos arbitrarios: itemgetter. Así que intente esto en su lugar:

from operator import itemgetter
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=itemgetter('name'))

12



Usando la transformación de Schwartzian de Perl,

py = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

hacer

sort_on = "name"
decorated = [(dict_[sort_on], dict_) for dict_ in py]
decorated.sort()
result = [dict_ for (key, dict_) in decorated]

da

>>> result
[{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]

Más en Transformación Schwartzian Perl

En informática, la transformación de Schwartz es una programación de Perl   modismo utilizado para mejorar la eficiencia de ordenar una lista de elementos. Esta   idioma es apropiado para la clasificación basada en la comparación cuando el orden es   En realidad, se basa en el orden de una propiedad determinada (la clave) del   elementos, donde la computación de esa propiedad es una operación intensiva que   debe realizarse un número mínimo de veces. El Schwartzian   La transformación es notable porque no usa matrices temporales con nombre.


12



Debe implementar su propia función de comparación que comparará los diccionarios por valores de claves de nombre. Ver Clasificando Mini-HOW TO desde PythonInfo Wiki


11



a = [{'name':'Homer', 'age':39}, ...]

# This changes the list a
a.sort(key=lambda k : k['name'])

# This returns a new list (a is not modified)
sorted(a, key=lambda k : k['name']) 

9