Python: Comment sortinger une liste de dictionnaires par plusieurs valeurs?

Je veux sortinger une liste d’abord par une valeur et ensuite par une seconde valeur. Y a-t-il un moyen facile de faire ceci? Voici un petit exemple:

A = [{'name':'john','age':45}, {'name':'andi','age':23}, {'name':'john','age':22}, {'name':'paul','age':35}, {'name':'john','age':21}] 

Cette commande permet de sortinger cette liste par 'name' :

 sorted(A, key = lambda user: user['name']) 

Mais comment puis-je sortinger cette liste par une seconde valeur? Comme 'age' dans cet exemple.

Je veux un sorting comme celui-ci (sortingez d’abord par 'name' puis sortingez par 'age' ):

 andi - 23 john - 21 john - 22 john - 45 paul - 35 

Merci!

     >>> A = [{'name':'john','age':45}, {'name':'andi','age':23}, {'name':'john','age':22}, {'name':'paul','age':35}, {'name':'john','age':21}] >>> sorted(A, key = lambda user: (user['name'], user['age'])) [{'age': 23, 'name': 'andi'}, {'age': 21, 'name': 'john'}, {'age': 22, 'name': 'john'}, {'age': 45, 'name': 'john'}, {'age': 35, 'name': 'paul'}] 

    Ceci sortinge par un tuple des deux atsortingbuts, le suivant est équivalent et beaucoup plus rapide / cleaner:

     >>> from operator import itemgetter >>> sorted(A, key=itemgetter('name', 'age')) [{'age': 23, 'name': 'andi'}, {'age': 21, 'name': 'john'}, {'age': 22, 'name': 'john'}, {'age': 45, 'name': 'john'}, {'age': 35, 'name': 'paul'}] 

    D’après les commentaires: @Bakuriu

    Je parie qu’il n’y a pas une grande différence entre les deux, mais itemgetter évite un peu d’overhead car il extrait les clés et fait le tuple pendant un seul opcode ( CALL_FUNCTION ), tout en appelant le lambda devra appeler la fonction, charger les différents les constantes (qui sont d’autres bytecodes) appellent finalement l’indice ( BINARY_SUBSCR ), construisent le tuple et le renvoient … c’est beaucoup plus de travail pour l’interprète.

    Pour résumer: itemgetter conserve l’exécution au niveau C , aussi vite que possible.

     from operator import itemgetter sorted(your_list, key=itemgetter('name', 'age')) 

    Voici la solution générale alternative – il sortinge les éléments de dict par les clés et les valeurs. L’avantage de cela – pas besoin de spécifier des clés, et cela fonctionnerait encore si certaines clés sont manquantes dans certains des dictionnaires.

     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)