查找列表的平均值


473

我必须在Python中找到列表的平均值。到目前为止,这是我的代码

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

我已经知道了,所以它可以将列表中的值加在一起,但是我不知道如何将其划分为它们?


45
numpy.mean如果你能负担得起安装numpy的
米奇

7
sum(L) / float(len(L))。处理呼叫者代码中的空列表,例如if not L: ...
n611x007

4
@mitch:是否可以负担得起安装numpy的问题。numpy本身就是一个完整的词。这是您实际上是否需要numpy。对于不使用numpy进行平均值计算的16mb C扩展安装numpy,这是非常不切实际的。
n611x007

3
如果使用python 3,而不是仅为avg / mean安装整个numpy软件包,我们就可以通过“从统计导入平均值”使用统计模块来完成此操作,或者在python 2.7或更低版​​本上,可以从src下载统计模块: hg.python.org/cpython/file/default/Lib/statistics.py doc:docs.python.org/dev/library/statistics.html 并直接使用。
25mhz

Answers:


567

在Python 3.4+上,您可以使用 statistics.mean()

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

import statistics
statistics.mean(l)  # 20.11111111111111

在旧版本的Python上,您可以执行

sum(l) / len(l)

在Python 2上,您需要转换len为浮点数才能进行浮点数除法

sum(l) / float(len(l))

无需使用reduce。它慢得多,并在Python 3 中删除


9
如果列表由int组成,则python 2下的结果将为int
mitch 2012年

那很完美 !对不起这个愚蠢的问题,但是我真的到处都在寻找它!非常感谢 !
卡拉·德西

7
就像我说的那样,我是新手,我想我必须使用循环或某种方法来计算其中的数字量,但我没有意识到我只能使用长度。这是第一件事情我已经与蟒蛇做..
卡拉Dessi

2
如果总和不适合int / float怎么办?
Foo Bar用户

5
@FooBarUser,那么您应该计算k = 1.0 / len(l),然后减少:reduce(lambda x,y:x + y * k,l)
Arseniy 2014年

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

63
如果使用from __future__ import division,则可以消除这种难看float
S.Lott 2012年

12
同意 float就像地狱一样丑陋,只是想使其更简单。
yprez 2012年

39
消除“丑陋”浮动的另一种方法:sum(l, 0.0) / len(l)
remosu 2013年

26
作为C ++程序员,整洁如地狱和浮动根本不是丑陋的!
lahjaton_j 2016年

20
在python3中,您可以使用sum(l) / len(l)
VasiliNovikov

283

您可以使用numpy.mean

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

import numpy as np
print(np.mean(l))

4
那很奇怪。我本来以为这样做会更有效,但是在随机浮点列表上看起来它所花的时间比简单地花了8倍sum(l)/len(l)
L. Amber O'Hearn

8
呵呵,不过np.array(l).mean()快。
L. Amber O'Hearn

8
@ L.AmberO'Hearn,我只是计时,并np.mean(l)np.array(l).mean大约相同的速度,并sum(l)/len(l)为约两倍的速度。我曾经用过l = list(np.random.rand(1000)),当然numpy如果l是的话,两种方法都会变得更快numpy.array
Akavall 2015年

11
好吧,除非那是安装numpy的唯一原因。在这个规模上,安装一个16mb C软件包(无论其声望如何)都显得很奇怪。
n611x007

但在我看来。在正常情况下无需关心速度。–
tyan

230

一个统计模块已经加入到了Python 3.4。它具有计算平均值的功能,称为均值。您提供的列表的示例为:

from statistics import mean
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
mean(l)

28
这是最优雅的答案,因为它采用了自python 3.4起可用的标准库模块。
Serge Stroobandt

4
而且数值上更稳定
Antti Haapala

如果您不小心传入一个空列表,statistics.StatisticsError: mean requires at least one data point而不是ZeroDivisionError: division by zero对该sum(x) / len(x)解决方案进行更神秘的描述,它将产生一个更好的错误。
鲍里斯(Boris)


36

如果您使用的是python> = 3.4,则有一个统计资料库

https://docs.python.org/3/library/statistics.html

您可以使用这种卑鄙的方法。假设您有一个要查找均值的数字列表:-

list = [11, 13, 12, 15, 17]
import statistics as s
s.mean(list)

它还有其他方法,如stdev,方差,众数,谐波均值,中位数等,这些方法也非常有用。



10

sum(l) / float(len(l)) 是正确的答案,但仅出于完整性考虑,您可以通过一次减少来计算平均值:

>>> reduce(lambda x, y: x + y / float(len(l)), l, 0)
20.111111111111114

请注意,这可能会导致轻微的舍入错误:

>>> sum(l) / float(len(l))
20.111111111111111

我知道这只是为了好玩,但返回0代表空列表可能不是最好的选择
Johan Lundberg 2012年

1
@JohanLundberg-您可以将False替换为0作为最后一个参数reduce(),如果该参数为空,则为False,否则可以像以前一样取平均值。
安德鲁·克拉克

@AndrewClark你为什么要逼floatlen
EndermanAPM


6

或使用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


这不是熊猫问题,因此为进行简单的操作(例如求平均值)而导入如此繁重的库似乎太过分了。
cs95

4

在Udacity的问题中,我也有类似的问题要解决。我编码的不是内置函数:

def list_mean(n):

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

比平常更长的时间,但是对于初学者来说,这是一个很大的挑战。


1
好。其他所有答案都没有注意到空列表的危害!
wsysuper

1
返回False(等于integer 0)几乎是处理此错误的最坏方法。更好地抓住ZeroDivisionError并提出更好的东西(也许ValueError)。
kindall

@kindall ValueError比a更好ZeroDivisionError吗?后者更具体,再加上只抛出一个不同的算术错误似乎似乎没有必要。
MatTheWhale

因为ZeroDivisionError仅当您知道如何进行计算时才有用(即,涉及除以列表长度)。如果您不知道,它不会告诉您传入的值是什么问题。而您的新异常可以包括更具体的信息。
kindall

4

作为一个初学者,我只是编写了这样的代码:

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)

Bravo:恕我直言,sum(l)/len(l)到目前为止,这是最优雅的答案(无需在Python 3中进行类型转换)。
fralau

4

如果您想获得的不仅仅是平均值(也就是平均值),您可以查看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)

3

为了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
有趣,但这不是他要的。
约翰·伦德伯格

3

两者都可以为您提供接近整数或至少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)的发言是正确的。


3

假设

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

您会注意到它的x尺寸为3 * 10,如果您需要mean进入每一行,则可以键入

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

别忘了 import numpy as np


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

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

3
效率低下。它将所有元素转换为float,然后再添加它们。仅转换长度会更快。
克里斯·科斯顿


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

或喜欢以前发布的

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

1.0是确保获得浮点除法


0

结合以上几个答案,我提出了以下与reduce一起使用的方法,并且不假定您在reduce L函数中可用:

from operator import truediv

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

def sum_and_count(x, y):
    try:
        return (x[0] + y, x[1] + 1)
    except TypeError:
        return (x + y, 2)

truediv(*reduce(sum_and_count, L))

# prints 
20.11111111111111

0

我想添加另一种方法

import itertools,operator
list(itertools.accumulate(l,operator.add)).pop(-1) / len(l)

-5
numbers = [0,1,2,3]

numbers[0] = input("Please enter a number")

numbers[1] = input("Please enter a second number")

numbers[2] = input("Please enter a third number")

numbers[3] = input("Please enter a fourth number")

print (numbers)

print ("Finding the Avarage")

avarage = int(numbers[0]) + int(numbers[1]) + int(numbers[2]) + int(numbers [3]) / 4

print (avarage)

如果用户将浮点数添加到您的数组怎么办?结果将是非常不精确的。
Flame_Phoenix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.