Nikhil
Nikhil

Reputation: 65

Error when the lambda expression is taking two arguments in Python

I am new to Python and practicing basics. I am using a lambda expression to take two arguments and performing square operations on them (eg: var ** 2). The two arguments are coming from the zip(list1, list2). I am getting TypeError for this. I tried searching for the solution but didn't get any. I even tried writing lambda arguments in parenthesis (eg: lambda (v1,v2):) but that threw SyntaxError.

Below is the python code:

list1 = [1,2,3,4]
list2 = [5,6,7,8]
print ( list(map(lambda v1,v2: (v1**2, v2**2), list(zip(list1, list2)))) )

Error:

TypeError                                 Traceback (most recent call last)
<ipython-input-241-e93d37efc752> in <module>()
      1 list1 = [1,2,3,4]
      2 list2 = [5,6,7,8]
----> 3 print ( list(map(lambda v1,v2: (v1**2, v2**2), list(zip(list1, list2)))) )

TypeError: <lambda>() missing 1 required positional argument: 'v2'

Upvotes: 3

Views: 2559

Answers (2)

Christophe Ramet
Christophe Ramet

Reputation: 666

In your print, map will cal the function lambda on a list of tuples (as list(zip(list1, list2)) produce a list of tuples).

So for instance you can do :

print(list(map(lambda(v1,v2): (v1**2, v2**2), list(zip(list1, list2)))))

Your lambda function will use the tuple (v1,v2) as parameters, instead of two parameters.

Upvotes: 0

Błotosmętek
Błotosmętek

Reputation: 12927

You're giving a single list as argument to map, thus map calls your lambda with one element of the list at a time - that is one argument, even though it is a tuple. What you probably want is:

print ( list(map(lambda v: (v[0]**2, v[1]**2), zip(list1, list2))) )

so that your item from the list is passed as a sole argument to lambda. If you insist on the two-argument lambda, discard zip and pass your lists directly to map as separate arguments:

print ( list(map(lambda v1,v2: (v1**2, v2**2), list1, list2)) )

Upvotes: 9

Related Questions