What is `lambda` in Python code? How does it work with `key` arguments to `sorted`, `sum` etc.?
Asked Answered
T

4

87

I saw some examples using built-in functions like sorted, sum etc. that use key=lambda.

What does lambda mean here? How does it work?


For the general computer science concept of a lambda, see What is a lambda (function)?.

See also How are lambdas useful? for some discussion that no longer meets site standards but which you may find useful.

Tremain answered 2/12, 2012 at 12:24 Comment(2)
key in this case is a keyword argument and has nothing to do with lambda.Acre
See this: #8967038Outtalk
R
123

A lambda is an anonymous function:

>>> f = lambda: 'foo'
>>> print(f())
foo

It is often used in functions such as sorted() that take a callable as a parameter (often the key keyword parameter). You could provide an existing function instead of a lambda there too, as long as it is a callable object.

Take the sorted() function as an example. It'll return the given iterable in sorted order:

>>> sorted(['Some', 'words', 'sort', 'differently'])
['Some', 'differently', 'sort', 'words']

but that sorts uppercased words before words that are lowercased. Using the key keyword you can change each entry so it'll be sorted differently. We could lowercase all the words before sorting, for example:

>>> def lowercased(word): return word.lower()
...
>>> lowercased('Some')
'some'
>>> sorted(['Some', 'words', 'sort', 'differently'], key=lowercased)
['differently', 'Some', 'sort', 'words']

We had to create a separate function for that, we could not inline the def lowercased() line into the sorted() expression:

>>> sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower())
  File "<stdin>", line 1
    sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower())
                                                           ^
SyntaxError: invalid syntax

A lambda on the other hand, can be specified directly, inline in the sorted() expression:

 >>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda word: word.lower())
['differently', 'Some', 'sort', 'words']

Lambdas are limited to one expression only, the result of which is the return value.

There are loads of places in the Python library, including built-in functions, that take a callable as keyword or positional argument. There are too many to name here, and they often play a different role.

Rozanna answered 2/12, 2012 at 12:26 Comment(0)
T
22

In Python, lambda is a keyword used to define anonymous functions(i.e., functions that don't have a name), sometimes called lambda functions (after the keyword, which in turn comes from theory).

Let's see some examples:

>>> # Define a lambda function that takes 2 parameters and sums them:
>>> lambda num1, num2: num1 + num2 
<function <lambda> at 0x1004b5de8>
>>> 
>>> # We can store the returned value in variable & call it:
>>> addition = lambda num1, num2: num1 + num2
>>> addition(62, 5)
67
>>> addition(1700, 29)
1729
>>> 
>>> # Since it's an expression, we can use it in-line instead:
>>> (lambda num1, num2: num1 + num2)(120, 1)
121
>>> (lambda num1, num2: num1 + num2)(-68, 2)
-66
>>> (lambda num1, num2: num1 + num2)(-68, 2**3)
-60
>>> 

Now let's see how this works in the context of sorted.

Suppose we have a list like so, with a mixture of integers and strings with numeric contents:

nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]

and that we would like to sort the values according to the number they represent: thus, the result should be ['-10', '-1', 1, '2', 3, 4, '5', '8'].

If we try to sort it using sorted, we get the wrong result:

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]
>>> sorted(nums) # in 2.x
[1, 3, 4, '-1', '-10', '2', '5', '8']
>>> # In 3.x, an exception is raised instead

By using a key for sorted, however, we can sort the values according to the result of applying the key function to each value:

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]
>>> sorted(nums, key=int)
['-10', '-1', 1, '2', 3, 4, '5', '8']
>>> 

Since lambda creates a callable (specifically, a function), we can use one for the key:

>>> names = ["Rishikesh", "aman", "Ajay", "Hemkesh", "sandeep", "Darshan", "Virendra", "Shwetabh"]
>>> names2 = sorted(names)
>>> names2
['Ajay', 'Darshan', 'Hemkesh', 'Rishikesh', 'Shwetabh', 'Virendra', 'aman', 'sandeep']
>>> # Let's use a lambda to get a case-insensitive sort:
>>> names3 = sorted(names, key=lambda name:name.lower())
>>> names3
['Ajay', 'aman', 'Darshan', 'Hemkesh', 'Rishikesh', 'sandeep', 'Shwetabh', 'Virendra']
>>>
Tolle answered 2/9, 2017 at 11:7 Comment(0)
N
13

Lambda can be any function. So if you had a function

def compare_person(a):
         return a.age

You could sort a list of Person (each of which having an age attribute) like this:

sorted(personArray, key=compare_person)

This way, the list would be sorted by age in ascending order.

Your example contains "lambda" because python has a nifty lambda keyword for defining such functions on the fly. Instead of defining a function compare_person and passing that to sorted, you can also write:

sorted(personArray, key=lambda a: a.age)

which does the same thing.

Normy answered 2/12, 2012 at 12:32 Comment(0)
S
4
 >>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda word: word.lower())

Actually, above codes can be:

>>> sorted(['Some','words','sort','differently'],key=str.lower)

According to https://docs.python.org/2/library/functions.html?highlight=sorted#sorted, key specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower. The default value is None (compare the elements directly).

Spoilfive answered 4/6, 2016 at 7:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.