Как получить общую сумму в нескольких списках с помощью python

[templatetag.py]

def total_sum(value):
    value_list = value[:, 1:]
    return [sum(i) for i in zip(*value_list)]

[html]

{% load total_sum from templatetag %}

<tr>
  <td>Monthly Total</td>
  <td>{{ monthly_enroll_list|total_sum }}</td> <!-- Total (Jan) -->
  <td>{{ monthly_enroll_list }}</td> <!-- Total (Feb) -->
  <td>{{ monthly_enroll_list }}</td> <!-- Total (Mar) -->
  <td>{{ monthly_enroll_list }}</td>
  <td>{{ monthly_enroll_list }}</td>
  <td>{{ monthly_enroll_list }}</td>
  <td>{{ monthly_enroll_list }}</td>
  <td>{{ monthly_enroll_list }}</td>
  <td>{{ monthly_enroll_list }}</td>
  <td>{{ monthly_enroll_list }}</td>
  <td>{{ monthly_enroll_list }}</td>
  <td>{{ monthly_enroll_list }}</td>
</tr>
  1. The value of the "monthy_enroll_list" variable is as follows.

[['A', 3, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 8], ['B', 1, 8, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1],

  1. If I remove the index at the beginning and the end of each list, I get the number of enrolls from January to December. I want to get the total sum per month. The values ​​I want to get are:

['6', '10', '12', '6', '0', '0', '0', '0', '0', '0', '0', '0']

  1. But i got the following error:

индексы списка должны быть целыми числами или срезами, а не кортежами

Спасибо, что сообщили мне, как решить эту проблему

Проблема заключается в функции zip, которую вы вызываете. Взяв вашу функцию, давайте сосредоточимся на части zip:

# your current function
def total_sum(value):
    value_list = value[:, 1:]
    return [sum(i) for i in zip(*value_list)]

Предположим, что наше значение равно:

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

Если мы делаем:

print(list(zip(*v))

Получаем:

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

Это не то, что мы можем вызвать sum, поскольку вы пытаетесь суммировать список кортежей.

Так что вместо

return [sum(i) for i in zip(*value_list)]

в последней строке функции, вы можете изменить это на:

total = 0
for inner_list in values_list:
    total += sum(inner_list)
return total

Ваша новая функция, таким образом, будет выглядеть так:

def total_sum(value):
    value_list = value[:, 1:]
    total = 0
    for inner_list in values_list:
        total += sum(inner_list)
    return total
Вернуться на верх