Is there any other argument than key
, for example: value
?
The sort() method accepts a reverse parameter as an optional argument.
Python sorted() Function The sorted() function returns a sorted list of the specified iterable object. You can specify ascending or descending order. Strings are sorted alphabetically, and numbers are sorted numerically.
Sorting Numbers The function sorted() did not have to be defined. It's a built-in function that is available in a standard installation of Python. sorted() , with no additional arguments or parameters, is ordering the values in numbers in an ascending order, meaning smallest to largest.
Like C++ sort(), Java sort() and other languages, python also provides built in function to sort. The sort function can be used to sort the list in both ascending and descending order. To sort the list in ascending order.
sort
and sorted
Both sort
and sorted
have three keyword arguments: cmp
, key
and reverse
.
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
Using key
and reverse
is preferred, because they work much faster than an equivalent cmp
.
key
should be a function which takes an item and returns a value to compare and sort by. reverse
allows to reverse sort order.
key
argumentYou can use operator.itemgetter
as a key argument to sort by second, third etc. item in a tuple.
>>> from operator import itemgetter
>>> a = range(5)
>>> b = a[::-1]
>>> c = map(lambda x: chr(((x+3)%5)+97), a)
>>> sequence = zip(a,b,c)
# sort by first item in a tuple
>>> sorted(sequence, key = itemgetter(0))
[(0, 4, 'd'), (1, 3, 'e'), (2, 2, 'a'), (3, 1, 'b'), (4, 0, 'c')]
# sort by second item in a tuple
>>> sorted(sequence, key = itemgetter(1))
[(4, 0, 'c'), (3, 1, 'b'), (2, 2, 'a'), (1, 3, 'e'), (0, 4, 'd')]
# sort by third item in a tuple
>>> sorted(sequence, key = itemgetter(2))
[(2, 2, 'a'), (3, 1, 'b'), (4, 0, 'c'), (0, 4, 'd'), (1, 3, 'e')]
Sequences can contain any objects, not even comparable, but if we can define a function which produces something we can compare for each of the items, we can pass this function in key
argument to sort
or sorted
.
itemgetter
, in particular, creates such a function that fetches the given item from its operand. An example from its documentation:
After,
f=itemgetter(2)
, the callf(r)
returnsr[2]
.
key
vs cmp
Just out of curiosity, key
and cmp
performance compared, smaller is better:
>>> from timeit import Timer
>>> Timer(stmt="sorted(xs,key=itemgetter(1))",setup="from operator import itemgetter;xs=range(100);xs=zip(xs,xs);").timeit(300000)
6.7079150676727295
>>> Timer(stmt="sorted(xs,key=lambda x:x[1])",setup="xs=range(100);xs=zip(xs,xs);").timeit(300000)
11.609490871429443
>>> Timer(stmt="sorted(xs,cmp=lambda a,b: cmp(a[1],b[1]))",setup="xs=range(100);xs=zip(xs,xs);").timeit(300000)
22.335839986801147
So, sorting with key
seems to be at least twice as fast as sorting with cmp
. Using itemgetter
instead of lambda x: x[1]
makes sort even faster.
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