Python - 平均每个" n"列表中的元素

时间:2017-01-30 10:07:13

标签: python list average

我需要对Python列表中的每个n元素进行平均,在此示例中为n = 3

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

这样输出列表就是:

list2 = [2, 2, 2, 5, 5, 5, 8, 8, 8]

5 个答案:

答案 0 :(得分:2)

您可以在列表推导中计算[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))]

最终编辑:找到一个很好的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)]))

答案 1 :(得分:1)

@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]

答案 2 :(得分: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: - )

说明:将作业分成两步;这有帮助吗?哪个部分还不清楚?

>>> 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]

更新:执行no-itertools one-liner的另一种方式:

>>> 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的第一个arg首先看起来包含在不必要的圆括号中......如果您这么认为,请尝试在没有它们的情况下运行它,看看会发生什么。

答案 3 :(得分:1)

我知道这篇文章很旧,但是如果有人正在寻找一个全数字的解决方案,只要该数组的长度可以被n整除,这两行就可以工作:

avg = np.mean(array1.reshape(-1, n), axis=1)
array2 = np.repeat(avg, n)

如果数组的长度不能被n整除,则可以对其余元素求平均值。一个执行此操作的函数可能看起来像这样:

import numpy as np
def average(arr, n):
    remainder = len(arr) % n
    if remainder == 0:
        avg = np.mean(arr.reshape(-1, n), axis=1)
        avg = np.repeat(avg, n)
        return avg
    else:
        avg_head = np.mean(arr[:-remainder].reshape(-1, n), axis=1)
        avg_tail = np.mean(arr[-remainder:])
        avg_head = np.repeat(avg_head, n)
        avg_tail = np.repeat(avg_tail, remainder)
        return np.append(avg_head, avg_tail)

n = 3,n = 4和n = 5的示例:

>>> array1 = np.arange(1, 10)
>>> array1
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> average(array1, 3)
array([2., 2., 2., 5., 5., 5., 8., 8., 8.])

>>> average(array1, 4)
array([2.5 2.5 2.5 2.5 6.5 6.5 6.5 6.5 9. ])

>>> average(array1, 5)
array([3.  3.  3.  3.  3.  7.5 7.5 7.5 7.5])

答案 4 :(得分:0)

你可以在numpy中使用mean:

import numpy as np
list1 = [1,2,3,4,5,6,7,8,9]
np.mean(np.array(list1).reshape(-1, 3), axis=1)