Albert - 9 months ago 128

Python Question

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!

Answer

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

Source (Stackoverflow)