Sum of list of lists; returns sum list

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!

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 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)

Method 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).

Method 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

Method 4

>>> data = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>> for column in enumerate(data[0]):
...     count = sum([x<div class="su-column su-column-size-1-2"><div class="su-column-inner su-u-clearfix su-u-trim"></div></div>] for x in data])
...     print 'Column %s: %d' % (column[0], count)
... 
Column 0: 3
Column 1: 6
Column 2: 9

Method 5

This does depend on your assumption that all the inner lists (or rows) are of the same length, but it should do what you want:

sum_list = []

ncols = len(data[0])

for col in range(ncols):
    sum_list.append(sum(row[col] for row in data))


sum_list
Out[9]: [13, 19, 14]

Method 6

def sum(L):
res = list()
for j in range(0,len(L[0])):
    tmp = 0
    for i in range(0,len(L)):
        tmp = tmp + L[i][j]
    res.append(tmp)
return res

Method 7

numArr = [[12, 4], [1], [2, 3]]

sumArr = 0

sumArr = sum(sum(row) for row in numArr)

print(sumArr) 

the answere: 22

what I did:
when you do “for” like this for example:
[row.append(1) for row in numArr]
the list will change to:
[[12, 4, 1], [1, 1], [2, 3, 1]]
I used the function sum() from python, the function takes the list and do iteration on it and bring the sum of all the numbers in the list. when I did sum(sum()) I got the sum of all the lists in the big list.

Method 8

This solution assumes a square matrix and uses two for loops to loop over the columns and rows, adding column-wise in the process. The result is returned in a list.

def foo(data):
    # initialise length of data(n) and sum_of_col variable 
    n = len(data)
    sum_of_col = []

    # iterate over column
    for col_i in range(n):
        # column sum
        col_count = 0;

        #iterate over row
        for row_i in range(n):
            col_count += data[row_i][col_i]

        # append sum of column to list    
        sum_of_col.append(col_count)

    return sum_of_col

Method 9

The simplest solution that will sum a list of lists of different or identical lengths is:

total = 0
for d in data:
    total += sum(d)

Once you understand list comprehension you could shorten it:

sum([sum(d) for d in data])

Method 10

For the case that the data is a list of lists of strings. Sum or concatenate a list of lists of strings elementwise.

>>> a = [list('abc'),list('def'),list('tyu')]
>>> a
[['a', 'b', 'c'], ['d', 'e', 'f'], ['t', 'y', 'u']]
>>> [''.join(thing) for thing in zip(*a)]
['adt', 'bey', 'cfu']
>>>


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x