I\'m going through the tutorial intro for Python and I\'m stuck on understanding a piece of code. This is from section 4.7.5 of the tutorial.
pairs = [(1, \'
Sometimes when starting to work with lambda
, it's easier to write out the function explicitly. Your lambda function is equivalent to:
def sort_key(pair):
return pair[1]
If we want to be more verbose, we can unpack pair to make it even more obvious:
def sort_key(pair):
int_value, string_value = pair
return string_value
Because list.sort
orders the items based on the return value of the key
function (if present), now we see that it is sorting the tuples by their string value. Since strings sort lexicographically, "four"
comes before "one"
(think alphabetical order).
A lambda
is a simplified function, using only an expression.
Any lambda can be written as a function, by adding in a return
before the expression, so lambda pair: pair[1]
becomes:
def lambda_function(pair): return pair[1]
So the lambda in the list.sort()
call here returns the second element of each sequence that is passed in (Python indexes start at 0
).
You can make this visible by assigning the lambda to a variable, say, key
:
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> key = lambda pair: pair[1]
>>> key(pairs[0])
'one'
>>> key(pairs[1])
'two'
The list.sort()
method uses the output of these calls (once for each element in the list) to sort the elements. So for the 4 elements, the function returns 'one'
, 'two'
, 'three'
, and 'four'
, and the 4 tuples are then sorted purely on the lexicographical (alphabetical) ordering of those 4 strings. That order would be 'four'
, 'one'
, 'three'
, 'two'
, which is what you see reflected in the final sorted list.
This form of sorting-by-alternative-key is commonly called a Schwartzian transform, after Randal L. Schwartz, who popularised the technique in Perl.
your lambda function takes an tuple as input and return the element with index 1 (so the second element since the first would have 0 for index).
so the sorting will only take into consideration the second element of each tuple (the English word). That's why your output is sorted alphabetically in the second element 'four'>'one'>'three'>'two'