Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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])