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


Answers

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'))
Question

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}]






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']))



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']) 



Digamos que tengo un Diccionario D con los elementos a continuación. Para ordenar simplemente use el argumento clave en ordenado para pasar la función personalizada de la siguiente manera

D = {'eggs': 3, 'ham': 1, 'spam': 2}

def get_count(tuple):
    return tuple[1]

sorted(D.items(), key = get_count, reverse=True)
or
sorted(D.items(), key = lambda x: x[1], reverse=True)  avoiding get_count function call

https://wiki.python.org/moin/HowTo/Sorting/#Key_Functions




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 argumento key 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.




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 sobre la transformación Perl Schwartzian

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




Aquí está la solución general alternativa: clasifica elementos de dict por claves y valores. La ventaja de esto, no es necesario especificar claves, y aún funcionaría si faltan algunas claves en algunos diccionarios.

def sort_key_func(item):
    """ helper function used to sort list of dicts

    :param item: dict
    :return: sorted list of tuples (k, v)
    """
    pairs = []
    for k, v in item.items():
        pairs.append((k, v))
    return sorted(pairs)
sorted(A, key=sort_key_func)





Related