18

I have some lists of numbers:

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

How can I add these lists' elements, assuming that all of the lists that I'm using are the same length?

Here's the kind of output I'd like to get from doing this to the above lists.

[6, 9, 12, 15, 18]

I know that I'll need a loop of some kind - but how can I do it elegantly?

Brighid McDonnell
  • 4,293
  • 4
  • 36
  • 61
kuafu
  • 1,466
  • 5
  • 17
  • 28

6 Answers6

34

Try this functional style code:

>>> map(sum, zip(*lists))
[6, 9, 12, 15, 18]

The zip function matches elements with the same index.

>>> zip(*lists)
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7)]

Then sum is applied to each tuple by using map.

See it working online: ideone


Note that in Python 3.x, map no longer returns a list. If you need the list, please see the following question:

(You can just call list).

Community
  • 1
  • 1
Mark Byers
  • 811,555
  • 193
  • 1,581
  • 1,452
9
>>> lis=[[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]]

>>> [sum(x) for x in zip(*lis)]
[6, 9, 12, 15, 18]
Ashwini Chaudhary
  • 244,495
  • 58
  • 464
  • 504
7

Assuming:

a = [1,2,3,4,5]
b = [2,3,4,5,6]
c = [3,4,5,6,7]

just do this:

[sum(n) for n in zip(*[a, b, c])]
Dominic Bou-Samra
  • 14,799
  • 26
  • 100
  • 156
6

Using numpy:

>>> seq = np.array([
... [1,2,3,4,5],
... [2,3,4,5,6],
... [3,4,5,6,7]])
>>> np.sum(seq,axis=0)
array([ 6,  9, 12, 15, 18])
Glorfindel
  • 21,988
  • 13
  • 81
  • 109
fraxel
  • 34,470
  • 11
  • 98
  • 102
  • 1
    Unless the OP wants to continue using numpy, I am not sure that converting to and from numpy is the best way to go. Of course if more calculations need to be performed, numpy would be the way to go – Dhara Jul 01 '12 at 09:41
2

How about:

a = [1,2,3,4,5]
b = [2,3,4,5,6]
c = [3,4,5,6,7]

s = map(sum, zip(a,b,c))
rodrigo
  • 94,151
  • 12
  • 143
  • 190
1

This one works for lists with various length too(nested only 1 time).

def sum_list_of_list_of_int(ll):
    l=[]
    for i in ll:  # "i" type is list
        for ii in range(len(i)):  # "ii" type is int
            if len(l)-1>=ii:
                l[ii]+=int(i[ii])
            else:
                l.append(int(i[ii]))
    return l
Saleh
  • 11
  • 1