мне нужно в среднем каждые n
элементы в списке Python, n = 3
в этом примере:Python - Средняя каждый «п» элементов в списке
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
Так что список вывода будет:
list2 = [2, 2, 2, 5, 5, 5, 8, 8, 8]
мне нужно в среднем каждые n
элементы в списке Python, n = 3
в этом примере:Python - Средняя каждый «п» элементов в списке
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
Так что список вывода будет:
list2 = [2, 2, 2, 5, 5, 5, 8, 8, 8]
Вы можете вычислить [2,5,8]
список в списке понимания, как это:
list1 = [1,2,3,4,5,6,7,8,9]
n = 3
list2 = [sum(list1[i:i+n])//n for i in range(0,len(list1),n)]
Затем положить его обратно в list1
(сохраняющего размере), как вы просили, как это:
for i in range(0,len(list1)):
list1[i] = list2[i//n]
или со списком пониманием:
list1 = [list2[i//n] for i in range(len(list1))]
Final редактирования: нашел хороший Oneliner подвести итоги:
import itertools
list1 = list(itertools.chain.from_iterable([i]*n for i in [sum(list1[i:i+n])//n for i in range(0,len(list1),n)]))
Достойный ответ, но это ИМО кажется, возможно, слишком щедрым для предоставить, когда ОП не предпринял никаких усилий. Также неясно, что разделение пола является наиболее подходящим здесь. –
спасибо. Я пытался сделать это в одной строке, но не смог. Да, вторая часть может быть сделана наоборот. Ох нашел один лайнер для выполнения всей работы. –
Спасибо @ Жан-Франсуа Фабр! В следующий раз я постараюсь сделать больше с моими собственными попытками! – bloomwoood
Заимствование немного от @Jean-François Fabre's answer но с использованием statistics.mean
(avaiable for python 3.4+):
>>> from statistics import mean
>>> from itertools import chain
>>> lst = [1,2,3,4,5,6,7,8,9]
>>> n = 3
>>> list(chain.from_iterable([mean(lst[i:i+n])]*n for i in range(0,len(lst),n)))
[2, 2, 2, 5, 5, 5, 8, 8, 8]
Вы можете использовать в виду NumPy как:
import numpy as np
list1 = [1,2,3,4,5,6,7,8,9]
np.mean(np.array(list1).reshape(-1, 3), axis=1)
>>> n = 3
>>> list1 = [1,2,3,4,5,6,7,8,9]
>>> [avg for avg in [sum(list1[i:i+n])//n for i in range(0,len(list1),n)] for j in range(n)]
[2, 2, 2, 5, 5, 5, 8, 8, 8]
Не нужно itertools :-)
Объяснение: После расщепляет работу в 2 этапа; это помогает? Какая часть еще неясна?
>>> n = 3
>>> list1 = [1,2,3,4,5,6,7,8,9]
>>> averages = [sum(list1[i:i+n])//n for i in range(0,len(list1),n)]
>>> print("averages: ", averages)
averages: [2, 5, 8]
>>> list2 = [avg for avg in averages for j in range(n)]
>>> print("list2: ", list2)
list2: [2, 2, 2, 5, 5, 5, 8, 8, 8]
UPDATE: Еще один способ делать не-itertools Однострочник:
>>> list2 = sum(([a]*n for a in [sum(list1[i:i+n])//n for i in range(0,len(list1),n)]), [])
[2, 2, 2, 5, 5, 5, 8, 8, 8]
Пояснение: Вычислим средние значения, как раньше. Затем выкладываем их вокруг, как это:
>>> averages = [2, 5, 8]
>>> list2 = sum(([a]*n for a in averages), []) ### see note [1] below
>>> list2
[2, 2, 2, 5, 5, 5, 8, 8, 8]
, который может быть дополнительно разматывают так:
>>> all_items = list([a]*n for a in averages)
>>> all_items
[[2, 2, 2], [5, 5, 5], [8, 8, 8]]
>>> sum(all_items, [])
[2, 2, 2, 5, 5, 5, 8, 8, 8]
>>>
Примечание [1]: Первый аргумент из sum
на первый взгляд должна содержаться в ненужную раунде скобки ... если вы так думаете, попробуйте запустить их без них и посмотреть, что произойдет.
Упоминайте, как это работает? – Pureferret
@Pureferret Это не сработало; см. последнюю попытку –
У этого все еще не хватает каких-либо объяснений ... – Pureferret
Вы что-то пробовали? – MYGz
Показать попытку кодирования, так что 'n' равно 3 в вашем примере? –
Не должен ли быть результат '[2,5,8]'? – wvdz