【问题标题】:Average elements in sublists子列表中的平均元素
【发布时间】:2013-08-30 16:37:24
【问题描述】:

我有一个由迭代过程创建的列表,由可变数量的子列表组成,所有这些子列表都具有相同数量的元素;这也是可变的。例如,在一次迭代中,我可以有 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_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。

标签: python list numpy


【解决方案1】:

你对使用 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 的答案更容易。现在不知道该选哪一个了。
  • 你把它标记为python,他只使用标准python(我觉得更令人印象深刻)我会和他一起去
  • 我从没想过pythonnumpy 是不同的实体,所以这对我来说并不重要。两个答案都非常好,我会稍等一下,听听其他人的意见,看看他们的投票结果。
  • @Gabriel 如果你被允许使用numpy 那就去吧,它比普通的python 更快。(但是从一开始就使用一个numpy数组,而不是列表)
  • @Gabriel - Numpy 和标准 Python 是独立的实体,因为某些 Python 安装没有 numpy。您还必须导入它。但是,我会说这个答案非常简短/干净(+1 BTW)。
【解决方案2】:

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()* 运算符一起可用于解压缩列表。

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

【讨论】:

  • O.O 好得惊人的快速和高效。非常感谢!
  • 优秀!不过可能想要舍入它:round(sum(x)/float(len(x)), 2)
猜你喜欢
  • 2021-09-30
  • 2020-07-12
  • 2013-07-22
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多