Introduction
Sorting is a common functionality in day-to-day programming. If you use Python, you are probably familiar with the two common ways you can sort your list values. The sorted()
function is a common way to sort any iterable while list.sort()
is built into the list. The main difference between the two functions is that list.sort()
modifies the list in-place while sorted()
creates a new list of sorted items.
Basic sorting
>>> sorted([4, 1, 3, 5, 2, 5, 8])
[1, 2, 3, 4, 5, 5, 8]
>>> l = [8, 24, 63, 12, 5, 23, 2, 6, 7, 8]
>>> l.sort()
>>> l
[2, 5, 6, 7, 8, 8, 12, 23, 24, 63]
Tip 1: Reverse ordering
Both methods allow an optional reverse
key which is a boolean value. You can use this to change the order of the sort from ascending to descending.
>>> sorted([4, 1, 3, 5, 2, 5, 8], reverse=True)
[8, 5, 5, 4, 3, 2, 1]
Tip 2: Key function
The 2 list methods have a key
function which allows you to pass in a function that is run before sorting each value.
For instance, if I want to order a string using the upper case I would do:
>>> sorted("For instance, if I want to order a".split(), key=str.upper)
['a', 'For', 'I', 'if', 'instance,', 'order', 'to', 'want']
For some cases, you might have a list of complex objects which you want to sort with their own index. You can pass a function referencing the index:
Say you have a list of handbag objects with Name
, Size
and Price
properties, you can sort them with the Price
like:
>>> handbags = [("Gucci", "L", 123), ("Vuitton", "M", 251), ("Jacobs", "S", 207)]
>>> handbags.sort(key=lambda bag: bag[2] )
>>> handbags
[('Gucci', 'L', 123), ('Jacobs', 'S', 207), ('Vuitton', 'M', 251)]
Tip 3: Multiple Level Sorting
Suppose you want to sort the bags according to their Price
and Size
, you can get that done by using Python's operator module which provides itemgetter
and attrgetter
.
>>> from operator import itemgetter, attrgetter
>>> sorted(handbags, key=itemgetter(1,2))
[('Gucci', 'L', 123), ('Vuitton', 'M', 251), ('Jacobs', 'S', 207)]
Or make it a list of objects with named attributes and use the names to sort:
>>> class Bag:
... def __init__(self, name, size, price):
... self.name = name
... self.price = price
... self.size = size
... def __repr__(self):
... return repr((self.name, self.size, self.price))
...
>>> bags = [Bag("Gucci", "L", 123), Bag("Vuitton", "M", 251), Bag("Jacobs", "S", 207)]
>>> bags.sort(key=attrgetter("price", "size"))
>>> bags
[('Gucci', 'L', 123), ('Jacobs', 'S', 207), ('Vuitton', 'M', 251)]
Conclusion
Sorting list items in Python is pretty easy and these tips can be used to achieve even much more with very little coding complexity. If you're worried about the stability of the sorting, Python sorts are guaranteed to be stable. That means that when multiple records have the same key, their original order is preserved.
Python uses Timsort algorithm that does multiple sorts efficiently because it can take advantage of any ordering already present in a dataset. You can read more about sorting in Python here
Top comments (0)