Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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!

like image 937
Albert Avatar asked Dec 09 '12 00:12

Albert


People also ask

How do you sum multiple lists in Python?

We use the sum() built in to sum, and a simple list comprehension to get the nth item from each list. As noted in my comment, this assumes you have a list of lists, as opposed to a load of variables: c_agents = [c_agent_0, c_agent_1, ...] Using data structures effectively will make your code much, much better.

Which function returns sum of items in a list?

The sum() function returns the sum of an iterable. Sum() takes a list (iterable) and returns the sum of the numbers within the list.


1 Answers

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) 
like image 119
RocketDonkey Avatar answered Sep 24 '22 18:09

RocketDonkey