2

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, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1])
pairs

This bit of code returns

[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

So in line one, it defines pairs with a list of different tuples. I get that. Line two is where I'm completely thrown off and I've done quite a bit of messing around with it to try to understand what's happening.

I've found that sort() is applying a built-in function to the variable pairs, and presumably it is sorting it per the instructions I'm giving it.

The sort() function requires a key, and key has to be defined using a function, hence the use of lambda. I think all of this is correct, but I may be way off here.

Lambda defines a new parameter, "pair" on the left side of the colon, and on the right side is the calculation to define the return value of the lambda function.

That's where I'm thrown off. What does "pair[1]" do? What is its affect on the "pair" on the left side of the colon?

What value does it return? I can't seem to get it to return any sort of value outside of coding it just like this.

I'm guessing that it somehow points to a specific tuple and sorts it based on repositioning that, but I'm not sure of the logic behind that.

Can anyone explain this for me? Thank you.

2
  • With lambda you reference on values that you need to sort by. Commented Sep 30, 2016 at 16:10
  • Would it help if you first did key = lambda pair: pair[1], then called key(pairs[0]) and compared that to, say, key(pairs[1])? What if I told you the end result is sorted alphabetically on the second element of each tuple? Commented Sep 30, 2016 at 16:10

3 Answers 3

3

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).

Sign up to request clarification or add additional context in comments.

Comments

1

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.

Comments

0

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'

1 Comment

Thank you so much. I have been staring at this for hours. I thought it was pointing to the position in the "pairs" variable (which once my mind got stuck on that, there was no coming back, not the position of the tuple. That makes much more sense now. Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.