Сумма списка списков; возвращает список сумм

Пусть 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] 

Как я могу перебирать список списков без ошибки индекса? Может быть, лямбда? Благодаря!

6 Solutions collect form web for “Сумма списка списков; возвращает список сумм”

Вы можете попробовать следующее:

 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(*l) :

 In [13]: for i in zip(*l): ....: print i ....: ....: (3, 1, 9) (7, 4, 8) (2, 5, 7) 

В случае списков с неравной длиной вы можете использовать itertools.izip_longest с fillvalue 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) 

Для любой матрицы (или других амбициозных численных) операций я бы рекомендовал посмотреть в 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-мерного массива (например).

Это даст вам сумму для каждого подсписок

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

Это зависит от вашего предположения, что все внутренние списки (или строки) имеют одинаковую длину, но они должны делать то, что вы хотите:

 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] 
 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 
  • Ошибка malloc в f2py
  • Суммирование массивов по характеристикам в Python
  • Суммируйте одно число для каждого элемента в списке (или массиве) в Python
  • Встроенная функция суммы Python против производительности цикла
  • Панды, группировка и суммирование за определенные месяцы
  • Как суммировать элементы dict
  • Python: длина строк строки
  • Python 2.7: Сжатие данных в формате XZ с использованием модуля «lzma»
  • Python - лучший язык программирования в мире.