Python-平均lis中的每个“n”元素

2021-06-14 22:23:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

因此输出列表将是:

list2 = [2, 2, 2, 5, 5, 5, 8, 8, 8]
3条回答
网友
1楼 ·

您可以在如下列表理解中计算[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))]

最后编辑:找到一个不错的单行本来总结一下:

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)]))
网友
2楼 ·
>>> 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]

不需要工具:-)

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

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

更新:另一种不使用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看起来包含在不必要的圆括号中。。。如果你这么认为,试着在没有他们的情况下运行它,看看会发生什么。

网友
3楼 ·

@Jean-François Fabre's answer借用一点,但使用^{} (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]

相关问题