Как суммируется вложенный список?

Положим, у нас есть список списков, где верхний список - список по годам, и в каждом годе список по месяцам.

data = [
[43.8, 60.5, 190.2, ],
[49.9, 54.3, 109.7, ],
[63.7, 72.0, 142.3, ],

]

считаем среднее по месяцам:

monthly_mean = []
n = len(data) # no of years
for m in range(12): 
    s = 0 # sum
    for y in data: 
        s += y[m] 
    monthly_mean.append(s/n)

единственное, у нас же при присвоении идёт первый, т.е. верхний, индекс списка "дата", т.е. года. Мы не должны таким кодом выбрать первые 12 лет (in range (12))? Почему не выбран нижний список?


Ответы (2 шт):

Автор решения: Ruslan G.

Не совсем понятна суть вопроса, но если задача стоит посчитать среднегодовые значения, то:

monthly_mean = []
for year in data:
    #  Если в каждом году данные всегда за полный год
    s = sum(year)/12
    #  Если же возможно, что за какой-то год неполное кол-во месяцев
    s = sum(year)/len(year)
    monthly_mean.append(s)

Или еще проще:

monthly_mean = [sum(year)/len(year) for year in data]

На выходе для приведенного списка data получим: [64.06666666666666, 71.3, 92.66666666666667]

пособие утверждает, что тем кодом машина считывает месяца, т.е. нижний уровень. код же очевидно вызывает верхний.

UPD: Прошу прощения за невнимательность. Только сейчас догнал суть.

monthly_mean = []
n = len(data) # количество
for m in range(12): # m - это порядковый номер месяца в году
    s = 0 # sum
    for y in data: # y = это массив "год", проходим по всем годам
        s += y[m]  # и суммируем показатели за месяц m
    monthly_mean.append(s/n) # добавляем в массив

Таким образом, в пособии написано верно. Считываем и суммируем сначала данные за 1 месяц каждого года, и делим на количество лет. Потом за второй месяц и так далее, до 12 месяца.

→ Ссылка
Автор решения: Daniil Loban

Не уверен что ответ соотвествует вопросу, но автору для анализа возможно понадобится.

  • считаем среднее по месяцам:
  • Почему не выбран нижний список?

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

Ответ:

На всякий случай я доработал функцию в случае если год не полный

  • d = это дельта (т.е. отнимаемое значение от высоты столбика - количества лет)

  • len(y) > m - если в году есть этот месяц

    import numpy as np
    
    data = [
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
      [1, 2, 30,],
    ]
    
    monthly_mean = []
    for m in range(12): 
      s = 0
      d = 1 if len(data[ len(data) - 1]) <= m else 0
      n = len(data) - d 
      for y in data: 
        if (len(y) > m):
           s += y[m] 
      monthly_mean.append(s / n)
    
    
    print(monthly_mean)
    

    [1.0, 2.0, 8.4, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]

→ Ссылка