Сумма списка списков; возвращает список сумм
Пусть data = [[3,7,2],[1,4,5],[9,8,7]]
Скажем, я хочу суммировать элементы для индексов каждого списка в списке, например добавить числа в столбце матрицы, чтобы получить один список. Я предполагаю, что все списки в данных равны по длине.
print foo(data)
[[3,7,2],
[1,4,5],
[9,8,7]]
_______
>>>[13,19,14]
Как я могу перебирать список списков, не получая индекс за пределами диапазона? Может быть, лямбда? Спасибо!
Ответы
Ответ 1
Вы можете попробовать следующее:
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]
Для распаковки списка используется комбинация zip
и *
, а затем zip элементы в соответствии с их индексом. Затем вы используете понимание списка, чтобы перебирать группы схожих индексов, суммируя их и возвращаясь в свое "исходное" положение.
Чтобы надеяться сделать это более понятным, вот что происходит, когда вы повторяете zip(*l)
:
In [13]: for i in zip(*l):
....: print i
....:
....:
(3, 1, 9)
(7, 4, 8)
(2, 5, 7)
В случае списков с неравной длиной вы можете использовать itertools.izip_longest
с fillvalue
of 0
- это в основном заполняет отсутствующие индексы с помощью 0
, позволяя вам суммировать все "столбцы":
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]
В этом случае, вот что будет выглядеть итерация над izip_longest
:
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)
Ответ 2
Для любой матрицы (или других амбициозных численных) операций я бы рекомендовал посмотреть в NumPy.
Образец для решения суммы массива вдоль оси, показанной в вашем вопросе, будет выглядеть следующим образом:
>>> 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])
Здесь документация numpy для ее функции sum: http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html#numpy.sum
Особенно интересен второй аргумент, поскольку он позволяет легко указать, что должно быть суммировано: все элементы или только определенная ось потенциально n-мерного массива (например).
Ответ 3
Это даст вам сумму для каждого подсписок
data = [[3,7,2],[1,4],[9,8,7,10]]
list(map(sum, data))
[12, 5, 34]
Если вы хотите суммировать все элементы и получить только одну сумму, используйте этот
data = [[3,7,2],[1,4],[9,8,7,10]]
sum(sum(data, []))
51
Ответ 4
>>> 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
Ответ 5
Это зависит от вашего предположения, что все внутренние списки (или строки) имеют одинаковую длину, но они должны делать то, что вы хотите:
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]
Ответ 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
Ответ 7
numArr = [[12, 4], [1], [2, 3]]
sumArr = 0
sumArr = sum(sum(row) for row in numArr)
print(sumArr)
the answere: 22
что я сделал:
когда вы делаете "для", как это, например:
[row.append(1) для строки в numArr]
список изменится на:
[[12, 4, 1], [1, 1], [2, 3, 1]]
Я использовал функцию sum() из python, функция берет список, выполняет итерацию и выводит сумму всех чисел в списке. когда я сделал sum (sum()), я получил сумму всех списков в большом списке.
Ответ 8
Это решение предполагает квадратную матрицу и использует два цикла for для циклического перебора столбцов и строк, добавляя их в процесс по столбцам. Результат возвращается в списке.
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
Ответ 9
Самый простой длинный метод, который я могу придумать:
total = 0
for d in data:
total += sum(d)
Как только вы поймете понимание списка, вы можете сократить его:
sum([sum(d) for d in data])