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!
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.
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.
>>> 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
itemgetteravoids a bit of overhead because it extracts the keys and make thetupleduring a single opcode(CALL_FUNCTION), while calling thelambdawill have to call the function, load the various constants(which are other bytecodes) finally call the subscript (BINARY_SUBSCR), build thetupleand 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.
from operator import itemgetter  sorted(your_list, key=itemgetter('name', 'age')) 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With