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!
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.
The sum() function returns the sum of an iterable. Sum() takes a list (iterable) and returns the sum of the numbers within the list.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With