我必须在Python中找到列表的平均值。到目前为止,这是我的代码
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print reduce(lambda x, y: x + y, l)
我已经知道了,所以它可以将列表中的值加在一起,但是我不知道如何将其划分为它们?
sum(L) / float(len(L))
。处理呼叫者代码中的空列表,例如if not L: ...
我必须在Python中找到列表的平均值。到目前为止,这是我的代码
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print reduce(lambda x, y: x + y, l)
我已经知道了,所以它可以将列表中的值加在一起,但是我不知道如何将其划分为它们?
sum(L) / float(len(L))
。处理呼叫者代码中的空列表,例如if not L: ...
Answers:
在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))
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
sum(l) / len(l)
from __future__ import division
,则可以消除这种难看float
。
float
就像地狱一样丑陋,只是想使其更简单。
sum(l, 0.0) / len(l)
sum(l) / len(l)
您可以使用numpy.mean
:
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
import numpy as np
print(np.mean(l))
sum(l)/len(l)
np.array(l).mean()
是多快。
np.mean(l)
与np.array(l).mean
大约相同的速度,并sum(l)/len(l)
为约两倍的速度。我曾经用过l = list(np.random.rand(1000))
,当然numpy
如果l
是的话,两种方法都会变得更快numpy.array
。
一个统计模块已经加入到了Python 3.4。它具有计算平均值的功能,称为均值。您提供的列表的示例为:
from statistics import mean
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
mean(l)
statistics.StatisticsError: mean requires at least one data point
而不是ZeroDivisionError: division by zero
对该sum(x) / len(x)
解决方案进行更神秘的描述,它将产生一个更好的错误。
reduce()
当Python具有完美的sum()
功能时,为什么要使用此功能?
print sum(l) / float(len(l))
(float()
必须强制Python执行浮点除法。)
float()
在Python 3上不需要
如果您使用的是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,方差,众数,谐波均值,中位数等,这些方法也非常有用。
除了将其强制转换为浮点数外,还可以在总和上加上0.0:
def avg(l):
return sum(l, 0.0) / len(l)
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
reduce()
,如果该参数为空,则为False,否则可以像以前一样取平均值。
float
上len
?
我尝试使用上面的选项,但是没有用。尝试这个:
from statistics import mean
n = [11, 13, 15, 17, 19]
print(n)
print(mean(n))
在python 3.5上工作
或使用pandas
的Series.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
以及整个文档:
在Udacity的问题中,我也有类似的问题要解决。我编码的不是内置函数:
def list_mean(n):
summing = float(sum(n))
count = float(len(n))
if n == []:
return False
return float(summing/count)
比平常更长的时间,但是对于初学者来说,这是一个很大的挑战。
False
(等于integer 0
)几乎是处理此错误的最坏方法。更好地抓住ZeroDivisionError
并提出更好的东西(也许ValueError
)。
ValueError
比a更好ZeroDivisionError
吗?后者更具体,再加上只抛出一个不同的算术错误似乎似乎没有必要。
ZeroDivisionError
仅当您知道如何进行计算时才有用(即,涉及除以列表长度)。如果您不知道,它不会告诉您传入的值是什么问题。而您的新异常可以包括更具体的信息。
为了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
两者都可以为您提供接近整数或至少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)的发言是正确的。
使用以下PYTHON代码在列表中查找平均值:
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print(sum(l)//len(l))
试试这个很容易。
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)