Как создать список из средних значений каждых последовательных четырех элементов?

Например, есть список:

list = [11, 12, 10, 13, 5, 2, 4, 8, 90, 91, 89, 90]

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

new_list = [(11+12+10+13) / 4, (5+2+4+8) / 4, (90+91+89+90) / 4]

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

Автор решения: MaxU
In [129]: n = 4

In [130]: res = [sum(lst[i:i + n]) / len(lst[i:i + n]) 
                 for i in range(0, len(lst), n)]

In [131]: res
Out[131]: [11.5, 4.75, 90.0]

PS никогда не используйте в качестве имен переменных или классов зарезервированные имена (такие как list). Тем самым вы замещаете встроенные имена и не сможете воспользоваться ими в последствии.

Пример того как не надо делать:

In [132]: list = list("abc")

In [133]: list
Out[133]: ['a', 'b', 'c']

Мы создали "безобидную" переменную с именем list и конструктор класса list отработал так как и ожидалось.

Теперь если мы захотим использовать конструктор list() еще раз - мы получим следующую ошибку:

In [134]: list2 = list("xyz")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-134-b4d5c223a736> in <module>
----> 1 list2 = list("xyz")

TypeError: 'list' object is not callable
→ Ссылка
Автор решения: MarianD
lst = [11, 12, 10, 13, 5, 2, 4, 8, 90, 91, 89, 90]

new_lst = [sum(quartet) / 4 for quartet in [lst[i:i+4]
               for i in range(0, len(lst), 4)]]

или постепенно:

quartets = [lst[i:i+4] for i in range(0, len(lst), 4)]
new_lst  = [sum(quartet) / 4 for quartet in quartets]
→ Ссылка
Автор решения: MarianD

Вы можете использовать функцию grouper() из рецептов стандартного модуля itertools:

import itertools


def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return itertools.zip_longest(*args, fillvalue=fillvalue)

def average(sequence):
    sequence = [el for el in sequence if el is not None]
    return sum(sequence) / len(sequence)


new_lst = [average(group) for group in grouper(lst, 4)]

Преимущество этого решения состоит в том, что даже в случае, когда число элементов списка неделимое на 4, вы получите правильные средние значения:

In[48]: lst = [11, 12, 10, 13, 5, 2, 4, 8, 90, 91, 89, 90, 1000, 2000]
In[49]: new_lst = [average(group) for group in grouper(lst, 4)]

In[50]: new_lst
Out[50]: [11.5, 4.75, 90.0, 1500.0]
→ Ссылка
Автор решения: MaxU

Решение с использованием Pandas и Numpy:

import pandas as pd
import numpy as np

s = pd.Series(lst)
res = s.groupby(np.arange(len(s)) // 4).mean()

результат:

In [143]: res
Out[143]:
0    11.50
1     4.75
2    90.00
dtype: float64
→ Ссылка
Автор решения: Spartak

Чистый код, без библиотек. Не самое быстроработающее решение, но за то одно из самых последовательных и понятных даже новичку:

a = [4,4,4,4,2,2,2,2,3,3,3,3,5,5,5,5] # входные данные
b = [] #выходные данные
count1 = 0 #счетчик для списка
count2 = 0 #cчетчик для количества слагаемых
sum = 0 #сумма слагаемых элементов
while count1 <= len(a):
    if count2 <= 3:
        sum += a[count1]
        count2 +=1
    elif count2 == 4 and count1 < len(a):
        sum = sum/4
        b.append(sum) #запишем в b полученное среднее значение элементов
        sum = a[count1] #когда мы сложили 4 элемента, то сбрасываем счетчик на значение текущего элемента по индексу списка
        count2 = 1
    elif count2 == 4 and count1 == len(a): #необходимо добавить это условие, что бы последние 4 объекта тоже записались в b
        sum = sum / 4
        b.append(sum)
    count1 += 1
print(b)
→ Ссылка