Как создать список из средних значений каждых последовательных четырех элементов?
Например, есть список:
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 шт):
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
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]
Вы можете использовать функцию 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]
Решение с использованием 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
Чистый код, без библиотек. Не самое быстроработающее решение, но за то одно из самых последовательных и понятных даже новичку:
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)