Сумма вложенного списка без использования функции SUM (упражнение)

Попытка написать функцию, которая берет сумму каждого списка и возвращает отдельные значения в новом единственном списке. Например,

[[2, 7, 6], [9, 5, 1], [4, 3, 8]]

становится

[15, 15, 15]

Что я до сих пор:

def row_sums(square):
 total_list = []
 total = 0
 for i in square:
 for j in i: 
 total += j
 total_list.append(total)
 return total_list

Но это просто накапливает каждый список друг на друга, в результате чего:

[15, 30, 45]

Я не уверен, как сохранить суммы для каждого списка отдельно. Функция SUM не допускается здесь, поскольку это упражнение на вложенных циклах.

Спасибо.

7 ответов

Ошибка в том, что вы не повторно инициализируете переменную total после каждого цикла. Вместо этого инициализируйте sum = 0 внутри него первым для цикла следующим образом:

def row_sums(square):
 total_list = []
 for i in square:
 total = 0
 for j in i: 
 total += j
 total_list.append(total)
 return total_list


Вам нужно reset ваш счетчик total перед началом каждого из них. Кроме того, вам не нужно объявлять его снаружи, потому что вы будете использовать его только внутри.

def row_sums(square):
 total_list = []
 for i in square:
 total = 0
 for j in i: 
 total += j
 total_list.append(total)
 return total_list


Просто для удовольствия:

>>> list = [[2, 7, 6], [9, 5, 1], [4, 3, 8]] 
>>> import functools
>>> [functools.reduce(lambda x, y: x + y, sublist, 0) for sublist in list]
[15, 15, 15]

Я не использовал sum:)

Подробнее о functools.reduce здесь.

Изменить: как указал Севантери в комментарии, вы также можете использовать [functools.reduce(int.__add__, sublist, 0) for sublist in list] (если вы действительно хотите, чтобы ваш учитель с ума сошел!)


Вам нужно обнулить общее количество для каждого списка.

def row_sums(square):
 total_list = []
 total = 0
 for i in square:
 for j in i: 
 total += j
 total_list.append(total)
 total = 0
 return total_list


Чтобы быть разным, сгладьте списки и используйте генератор (предполагается, что подсписки имеют одинаковую длину):

def _notsum2(lists):
 per_yield = len(lists)
 total = 0
 for ind, next in enumerate(val for sublist in lists for val in sublist):
 if ind % per_yield == 0 and ind:
 yield total
 total = 0
 total += next
 yield total
if __name__ == '__main__':
 li = [[2, 7, 6], [9, 5, 1], [4, 3, 8]]
 print [g for g in _notsum2(li)]


Вы также можете сделать это с помощью map и составить список как:

l=[[2, 7, 6], [9, 5, 1], [4, 3, 8]] 
a,b,c=[x for x in l]
map(lambda x,y,z:x+y+z, a,b,c)


[sum(i) for i in zip(*[[2, 7, 6], [9, 5, 1], [4, 3, 8]])]

bultin zip func - это то, что вам нужно именно

licensed under cc by-sa 3.0 with attribution.