Python 子列表中的平均元素

Python 子列表中的平均元素,python,list,numpy,Python,List,Numpy,我有一个列表,通过迭代过程创建,由数量可变的子列表组成,所有子列表都具有相同数量的元素;这也是可变的。例如,在一次迭代中,我可以有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]] 即,3个子列表,每个子列表包含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]]
即,3个子列表,每个子列表包含5个元素

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

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

avrg_list = [4.0, 4.25, 5.75]
在第二种情况下,对于
列表2

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

如何使用灵活的代码来调整自身以适应不同数量的子列表和元素?

使用
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()
*
操作符一起可用于解压缩列表

时间比较:

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

你对使用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])

您应该看看python的函数式编程工具——map、filter、reduce和lambda.O.O,它们的速度和效率令人惊讶。非常感谢你!卓越!不过,可能需要舍入:
round(sum(x)/float(len(x)),2)
这个答案似乎比Ashwini的答案更容易。现在我不知道该选哪一个了。你给它贴上了python标签,他只使用标准python(我觉得更令人印象深刻),我会和他一起去。我从来没有想过
python
numpy
是不同的实体,所以这对我来说并不重要。这两个答案都非常好,我会等一等,听听其他人的意见,看看他们投了什么票。@Gabriel如果你被允许使用
numpy
,那就试试吧,它比普通python快。(但从一开始就使用numpy数组,而不是列表)@Gabriel-Numpy和标准Python是独立的实体,因为Python的某些安装没有Numpy。您还必须导入它。然而,我会说这个答案非常简短/干净(+1 BTW)。
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])