GR Evans
GR Evans

Reputation: 13

How to do Math Functions on Lists within a List

I'm very new to python (using python3) and I'm trying to add numbers from one list to another list. The only problem is that the second list is a list of lists. For example:

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

What I want is to, say, add 1 to each item in the first list and 2 to each item in the second, returning something like this:

[[2, 3, 4], [6, 7, 8]]

I tried this:

original_lst = [[1, 2, 3], [4, 5, 6]]
trasposition_lst = [1, 2]
new_lst = [x+y for x,y in zip(original_lst, transposition_ls)]
print(new_lst)

When I do this, I get an error

can only concatenate list (not "int") to list

This leads me to believe that I can't operate in this way on the lists as long as they are nested within another list. I want to do this operation without flattening the nested list. Is there a solution?

Upvotes: 1

Views: 1160

Answers (5)

rpanai
rpanai

Reputation: 13437

A different approach than numpy that could work even for lists of different lengths is

lst = [[1, 2, 3], [4, 5, 6, 7]]
c = [1, 2]
res = [[l + c[i] for l in lst[i]] for i in range(len(c))]

Upvotes: 0

ak_slick
ak_slick

Reputation: 1016

You were very close with you original method. Just fell one step short.

Small addition

original_lst = [[1, 2, 3], [4, 5, 6]]
transposition_lst = [1, 2]
new_lst = [[xx + y for xx in x] for x, y in zip(original_lst, transposition_lst)]
print(new_lst)

Output

[[2, 3, 4], [6, 7, 8]]

Reasoning

If you print your original zip it is easy to see the issue. Your original zip yielded this:

In:

original_lst = [[1, 2, 3], [4, 5, 6]]
transposition_lst = [1, 2]
for x,y in zip(original_lst, transposition_lst):
    print(x, y)

Output

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

Now it is easy to see that you are trying to add an integer to a list (hence the error). Which python doesn't understand. if they were both integers it would add them or if they were both lists it would combine them.

To fix this you need to do one extra step with your code to add the integer to each value in the list. Hence the addition of the extra list comprehension in the solution above.

Upvotes: 1

rpanai
rpanai

Reputation: 13437

Why don't use numpy instead?

import numpy as np
mat = np.array([[1, 2, 3], [4, 5, 6]])
mul = np.array([1,2])
m = np.ones(mat.shape)
res = (m.T *mul).T + mat

Upvotes: 1

Ajax1234
Ajax1234

Reputation: 71451

You can use enumerate:

l = [[1, 2, 3], [4, 5, 6]]
new_l = [[c+i for c in a] for i, a in enumerate(l, 1)]

Output:

[[2, 3, 4], [6, 7, 8]]

Upvotes: 3

Rakesh
Rakesh

Reputation: 82765

One approach using enumerate

Demo:

l = [[1, 2, 3], [4, 5, 6]]
print(  [[j+i for j in v] for i,v in enumerate(l, 1)] )

Output:

[[2, 3, 4], [6, 7, 8]]

Upvotes: 4

Related Questions