Reputation: 515
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!
Upvotes: 43
Views: 101379
Reputation: 11
import numpy as np
l = [[3,7,2],[1,4,5],[9,8,7]]
print(sum(np.array(l)[:,:]))
print(sum(np.array(l)[:,0:2]))
#answer:
#[13 19 14]
#[13 19]
# use np like row column
Upvotes: 1
Reputation: 23783
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']
>>>
Upvotes: 0
Reputation: 100
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])
Upvotes: 0
Reputation: 23
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
Upvotes: 0
Reputation: 29
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.
Upvotes: -1
Reputation: 1
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
Upvotes: 0
Reputation: 1156
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
Upvotes: 12
Reputation: 37279
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)
Upvotes: 87
Reputation: 416
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).
Upvotes: 17
Reputation: 4347
>>> 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
Upvotes: 2
Reputation: 60230
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]
Upvotes: 0