Home > Mobile >  Mapping a list right in Python
Mapping a list right in Python

Time:10-23

I have a question on how to map correctly my list.

I have the following code:

class Bar():
    def __init__(self, i, j):
        self.i = i-1
        self.j = j-1

For the following list:

bars = [Bar(1,2), Bar(2,3), Bar(3,4), Bar(4,5), Bar(5,1),Bar(1,4), Bar(2,4), Bar(4,6), Bar(6,5)]

But for my problem, I have an array like this:

elementsmat=[[1, 1, 2], [2, 2, 3], [3, 3, 4], [4, 4, 5], [5, 5, 1], [6, 1, 4], [7, 2, 4], [8, 4, 6], [9, 6, 5]]

I used the following code to obtain an array where I removed the first element of each list of the list and then transformed it into a list.

s= np.delete(elementsmat, 0, 1)
r = s.tolist()
Output: [[1, 2], [2, 3], [3, 4], [4, 5], [5, 1], [1, 4], [2, 4], [4, 6], [6, 5]]

So, how can I apply the Bar function to all the elements of my new array correctly? I did this but I got the following error.

bars = map(Bar,r)
__init__() missing 1 required positional argument: 'j'

I thought it could be because in the first one the list has () and in my list I have [], but I am not sure.

CodePudding user response:

You can use itertools.starmap instead of map (after importing itertools). Your current way calls Bar([1, 2]). starmap unpacks the lists into arguments. A generator/list comprehension is also an option.

(Bar(*x) for x in r)

Now you see why it's called starmap.

CodePudding user response:

You need to unpack the nested lists into the call to Bar():

l = list(map(lambda x: Bar(*x), r))

itertools.starmap does the same thing.

Or, you can use a list-comprehension:

l = [Bar(i, j) for i, j in r]

CodePudding user response:

A built-in functional approach

lst = [[1, 2], [2, 3], [3, 4], [4, 5], [5, 1], [1, 4], [2, 4], [4, 6], [6, 5]]

map(Bar, *zip(*lst))
  • Related