sorted built-in and
sort list method can order lists based on the returned value of a function called on each element prior to making comparisons. This function is passed as the
key argument. For example, sorting a list of strings is case-sensitive by default:
>>> sorted('Nobody expects the Spanish Inquisition'.split()) ['Inquisition', 'Nobody', 'Spanish', 'expects', 'the']
We can make the sorting case-insensitive, however, by passing each word to the
>>> sorted('Nobody expects the Spanish Inquisition'.split(), key=str.lower) ['expects', 'Inquisition', 'Nobody', 'Spanish', 'the']
key=str.upper would work just as well). Note that the list elements themselves are not altered: they are being ordered based on a lower-case version of themselves. We do not use parentheses here, as in
str.lower(), because we are passing the
function itself to the
key argument, not calling it directly.
It is typical to use
lambda expressions to provide simple anonymous functions for this purpose. For example, to sort a list of atoms as (element symbol, atomic number) tuples in order of atomic number (the second item in each tuple):
>>> halogens = [('At', 85), ('Br', 35), ('Cl', 17), ('F', 9), ('I', 53)] >>> sorted(halogens, key=lambda e: e) [('F', 9), ('Cl', 17), ('Br', 35), ('I', 53), ('At', 85)]
Here, the sorting algorithm calls the function specified by
key on each tuple item to decide where it belongs in the sorted list. Our anonymous function simply returns the second element of each tuple, and so sorting is by atomic number.