Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: How to sort a list of dictionaries by several values?

I want to sort a list at first by a value and then by a second value. Is there an easy way to do this? Here is a small example:

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

This command is for sorting this list by 'name':

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

But how I can sort this list by a second value? Like 'age' in this example.

I want a sorting like this (first sort by 'name' and then sort by 'age'):

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

Thanks!

like image 666
Joko Avatar asked Apr 18 '13 12:04

Joko


People also ask

Can you sort dictionary values in Python?

We can sort lists, tuples, strings, and other iterable objects in python since they are all ordered objects. Well, as of python 3.7, dictionaries remember the order of items inserted as well. Thus we are also able to sort dictionaries using python's built-in sorted() function.

Can you sort a nested list?

There will be three distinct ways to sort the nested lists. The first is to use Bubble Sort, the second is to use the sort() method, and the third is to use the sorted() method.


2 Answers

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

This sorts by a tuple of the two attributes, the following is equivalent and much faster/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'}] 

From the comments: @Bakuriu

I bet there is not a big difference between the two, but itemgetter avoids a bit of overhead because it extracts the keys and make the tuple during a single opcode(CALL_FUNCTION), while calling the lambda will have to call the function, load the various constants(which are other bytecodes) finally call the subscript (BINARY_SUBSCR), build the tuple and return it... that's a lot more work for the interpreter.

To summarize: itemgetter keeps the execution fully on the C level, so it's as fast as possible.

like image 94
jamylak Avatar answered Sep 26 '22 18:09

jamylak


from operator import itemgetter  sorted(your_list, key=itemgetter('name', 'age')) 
like image 44
Jon Clements Avatar answered Sep 25 '22 18:09

Jon Clements