Sum of list of lists; returns sum list

75,838

Solution 1

You could try this:

In [9]: l = [[3,7,2],[1,4,5],[9,8,7]]

In [10]: [sum(i) for i in zip(*l)]
Out[10]: [13, 19, 14]

This uses a combination of zip and * to unpack the list and then zip the items according to their index. You then use a list comprehension to iterate through the groups of similar indices, summing them and returning in their 'original' position.

To hopefully make it a bit more clear, here is what happens when you iterate through zip(*l):

In [13]: for i in zip(*l):
   ....:     print i
   ....:     
   ....:     
(3, 1, 9)
(7, 4, 8)
(2, 5, 7)

In the case of lists that are of unequal length, you can use itertools.izip_longest with a fillvalue of 0 - this basically fills missing indices with 0, allowing you to sum all 'columns':

In [1]: import itertools

In [2]: l = [[3,7,2],[1,4],[9,8,7,10]]

In [3]: [sum(i) for i in itertools.izip_longest(*l, fillvalue=0)]
Out[3]: [13, 19, 9, 10]

In this case, here is what iterating over izip_longest would look like:

In [4]: for i in itertools.izip_longest(*l, fillvalue=0):
   ...:     print i
   ...:     
(3, 1, 9)
(7, 4, 8)
(2, 0, 7)
(0, 0, 10)

Solution 2

For any matrix (or other ambitious numerical) operations I would recommend looking into NumPy.

The sample for solving the sum of an array along the axis shown in your question would be:

>>> from numpy import array
>>> data = array([[3,7,2],
...     [1,4,5],
...     [9,8,7]])
>>> from numpy import sum
>>> sum(data, 0)
array([13, 19, 14])

Here's numpy's documentation for its sum function: http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html#numpy.sum

Especially the second argument is interesting as it allows easily specify what should be summed up: all elements or only a specific axis of a potentially n-dimensional array(like).

Solution 3

This will give you the sum for each sublist

data = [[3,7,2],[1,4],[9,8,7,10]]
list(map(sum, data))
[12, 5, 34]

If you want to sum over all elements and get just one sum then use this

data = [[3,7,2],[1,4],[9,8,7,10]]
sum(sum(data, []))
51

Solution 4

>>> data = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>> for column in enumerate(data[0]):
...     count = sum([x[column[0]] for x in data])
...     print 'Column %s: %d' % (column[0], count)
... 
Column 0: 3
Column 1: 6
Column 2: 9
Share:
75,838
Albert
Author by

Albert

Updated on January 06, 2020

Comments

  • Albert
    Albert over 4 years

    Let data = [[3,7,2],[1,4,5],[9,8,7]]

    Let's say I want to sum the elements for the indices of each list in the list, like adding numbers in a matrix column to get a single list. I am assuming that all lists in data are equal in length.

        print foo(data)
    
       [[3,7,2],
        [1,4,5],
        [9,8,7]]
        _______
     >>>[13,19,14]
    

    How can I iterate over the list of lists without getting an index out of range error? Maybe lambda? Thanks!