子列表中元素的平均值

5

我有一个列表,是通过迭代过程创建的,由可变数量的子列表组成,而且每个子列表都包含相同数量的元素;这个数量也是可变的。例如,在一次迭代中,我可以有4个子列表,每个子列表包含3个元素,如下所示:

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

在下一次代码迭代中,我可以有:

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

也就是说,每个子列表都有5个元素。

对于给定的迭代,所有子列表中的元素数量始终相同。

我需要一种方法来为迭代i生成一个新的列表,其中包含位于每个子列表相同位置上的所有元素的平均值。因此,在第一种情况下,对于list_1,我将获得:

avrg_list = [4.0, 4.25, 5.75]

第二种情况是针对 list_2

avrg_list = [1.67, 5.67, 7.67, 2.33, 4.67]

如何使用灵活的代码来处理不同数量的子列表和元素?

你应该看一下Python的函数式编程工具 - map、filter、reduce和lambda。 - Hrishi
2个回答

6

你对使用numpy感兴趣吗?

In [19]: list_1 = [[1,3,5], [7,4,9], [3,6,2], [5,4,7]]
In [22]: np.mean(list_1, 0)
Out[22]: array([ 4.  ,  4.25,  5.75])

这个答案似乎比Ashwini的答案还要简单。现在我不知道该选择哪一个了。 - Gabriel
你标记它为Python,他只使用标准的Python(我觉得更令人印象深刻),我会跟随他。 - Hammer
我从来没有将pythonnumpy视为不同的实体,所以这对我来说并不重要。两个答案都非常好,我会等一下听取其他人的意见并看看他们投票的结果。 - Gabriel
2
@Gabriel 如果你可以使用 numpy,那就用它吧,它比普通的 Python 更快。(但是从一开始就使用 numpy 数组,而不是列表) - Ashwini Chaudhary
1
@Gabriel - Numpy和标准Python是两个独立的实体,因为某些Python安装程序没有numpy。您还需要导入它。但是,我会说这个答案非常简洁/干净(顺便加一分)。 - user2555451
好的,我决定将这个标记为已接受,因为它更简单,显然也更快。而且Ashwini已经有了很多声望点,所以让我们给@Hammer一些爱吧 :) 谢谢大家。 - Gabriel

4

使用*结合zip

>>> [sum(x)/float(len(x)) for x in zip(*list_1)]
[4.0, 4.25, 5.75]
>>> [sum(x)/float(len(x)) for x in zip(*list_2)]
[1.6666666666666667, 5.666666666666667, 7.666666666666667, 2.3333333333333335, 4.666666666666667]

来自文档:

zip()*运算符结合使用可以用于解压列表。

>>> zip(*list_1)
[(1, 7, 3, 5), (3, 4, 6, 4), (5, 9, 2, 7)]

时间比较:

>>> from itertools import izip
>>> import numpy as np
>>> lis = list_1*1000
>>> arr = np.array(lis)
>>> %timeit np.mean(lis, 0)
10 loops, best of 3: 31.9 ms per loop
>>> %timeit np.mean(arr, 0)
1000 loops, best of 3: 221 us per loop    #clear winner
>>> %timeit [sum(x)/float(len(x)) for x in zip(*lis)]
100 loops, best of 3: 826 us per loop
#itertools.izip is memory efficient.
>>> %timeit [sum(x)/float(len(x)) for x in izip(*lis)]
100 loops, best of 3: 881 us per loop

哦,那真是非常快速和高效。非常感谢! - Gabriel
太棒了!不过可能需要四舍五入:round(sum(x)/float(len(x)), 2) - user2555451

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接