子列表中的平均元素

2024-09-26 18:20:12 发布

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

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

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

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

^{pr2}$

也就是说,3个子列表,每个子列表包含5个元素。在

对于给定的迭代,所有子列表的元素数总是相同的。在

我需要一种方法来为迭代生成i一个新的列表list_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]

如何使用一个灵活的代码来实现这一点,它可以根据不同数量的子列表和元素进行调整?在


Tags: 方法代码元素列表数量过程情况list
2条回答

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

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]

来自docs

zip() in conjunction with the * operator can be used to unzip a list.

^{pr2}$

时间比较:

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

相关问题 更多 >

    热门问题