寻找列表的平均值

673

如何在Python中计算列表的平均值?

[1, 2, 3, 4]  ⟶  2.5

59
如果您有安装numpy的能力,可以使用numpy.mean函数。 - mitch
9
sum(L) / float(len(L)) 的意思是计算列表 L 的平均值。在调用代码中处理空列表,可以使用 if not L: ... 来判断。 - n611x007
抱歉,我无法翻译此内容,因为它是一个链接。请提供要翻译的具体文本。 - n611x007
6
@mitch: 这不是你是否负担得起安装numpy的问题。numpy本身就是一个完整的工具。重点是你是否真正需要numpy。为了计算平均值而安装一个16mb的C扩展程序numpy,对于那些没有在其他方面使用它的人来说,这将是非常不切实际的。 - n611x007
4
如果使用Python 3,为了计算平均值而不必安装整个NumPy包,我们可以使用统计模块完成此操作,只需使用"from statistic import mean"即可。如果使用Python 2.7或更低版本,则可以从以下源代码安装统计模块:https://hg.python.org/cpython/file/default/Lib/statistics.py 文档链接:https://docs.python.org/dev/library/statistics.html。 - 25mhz
25个回答

7

或者使用 pandasSeries.mean 方法:

pd.Series(sequence).mean()

演示:

>>> import pandas as pd
>>> l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
>>> pd.Series(l).mean()
20.11111111111111
>>> 

来自文档:

Series.mean(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)

这里是有关此函数的文档:

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.mean.html

这里是完整的文档:

https://pandas.pydata.org/pandas-docs/stable/10min.html

说明:该函数用于计算序列中的平均值,参数包括指定轴、是否忽略空值等。更多详细信息请参见上述链接。

这不是关于pandas的问题,因此导入如此庞大的库来执行像查找平均值这样简单的操作似乎有些过度。 - cs95

5

我曾在Udacity的问题解决中遇到过类似的问题。我没有使用内置函数,而是进行了编码:

def list_mean(n):

    summing = float(sum(n))
    count = float(len(n))
    if n == []:
        return False
    return float(summing/count)

相比通常的时间更长,但对于初学者来说相当具有挑战性。


2
好的。其他答案都没有注意到空列表的危险! - wsysuper
1
返回 False(相当于整数 0)是处理此错误的最糟糕的方式之一。最好捕获 ZeroDivisionError 并引发更好的异常(例如 ValueError)。 - kindall
@kindall ValueError 怎么比 ZeroDivisionError 好?后者更具体,而且似乎捕获算术错误只是为了重新抛出不同的错误有点多余。 - MatTheWhale
因为ZeroDivisionError只有在您知道计算方式(即涉及列表长度的除法)时才有用。如果您不知道这一点,它就无法告诉您传入值的问题所在。而您的新异常可以包含更具体的信息。 - kindall

5

如果您想获得除平均值(又称均值)以外的更多数据,可以查看scipy统计模块:

from scipy import stats
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print(stats.describe(l))

# DescribeResult(nobs=9, minmax=(2, 78), mean=20.11111111111111, 
# variance=572.3611111111111, skewness=1.7791785448425341, 
# kurtosis=1.9422716419666397)

5

作为初学者,我只编写了以下代码:

L = [15, 18, 2, 36, 12, 78, 5, 6, 9]

total = 0

def average(numbers):
    total = sum(numbers)
    total = float(total)
    return total / len(numbers)

print average(L)

我认为,“sum(l)/len(l)”是最优雅的答案,而且在Python 3中不需要进行类型转换。 - fralau
不需要将值存储在变量中或使用全局变量。 - xilpex

4
为了使用 reduce 来计算一个序列的平均值,你需要追踪总和以及目前为止已经处理的元素数量。由于这不是列表中的一个简单元素,因此你还需要传递一个额外的参数给 reduce 进行折叠。
>>> l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
>>> running_average = reduce(lambda aggr, elem: (aggr[0] + elem, aggr[1]+1), l, (0.0,0))
>>> running_average[0]
(181.0, 9)
>>> running_average[0]/running_average[1]
20.111111111111111

1
有趣,但那不是他所问的。 - Johan Lundberg

4

两者可以给你接近相似的整数值,或者至少有10位小数。但如果你真的考虑到长浮点值,两者可能是不同的。方法可以根据你想要实现的目标而不同。

>>> l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
>>> print reduce(lambda x, y: x + y, l) / len(l)
20
>>> sum(l)/len(l)
20

浮点数
>>> print reduce(lambda x, y: x + y, l) / float(len(l))
20.1111111111
>>> print sum(l)/float(len(l))
20.1111111111

@Andrew Clark 在他的陈述中是正确的。


4
假设
x = [
    [-5.01,-5.43,1.08,0.86,-2.67,4.94,-2.51,-2.25,5.56,1.03],
    [-8.12,-3.48,-5.52,-3.78,0.63,3.29,2.09,-2.13,2.86,-3.33],
    [-3.68,-3.54,1.66,-4.11,7.39,2.08,-2.59,-6.94,-2.26,4.33]
]

你可以看到,如果你需要获取每行的 mean ,那么你会发现 x 的维度是3 * 10。

theMean = np.mean(x1,axis=1)

不要忘记 import numpy as np


2
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]

l = map(float,l)
print '%.2f' %(sum(l)/len(l))

3
效率低。它在将所有元素相加之前都将它们转换为浮点数。只转换长度会更快。 - Chris Koston

2

通过使用以下PYTHON代码,找到列表中的平均值:

l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print(sum(l)//len(l))

试一下,很容易。


0
print reduce(lambda x, y: x + y, l)/(len(l)*1.0)

或者像之前发布的那样

sum(l)/(len(l)*1.0)

1.0 是为了确保您获得浮点数除法


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