查找列表的平均值

Car*_*ssi 423 python reduce lambda average list

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

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

我已经得到它所以它将列表中的值加在一起,但我不知道如何将它分成它们?

ypr*_*rez 509

l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
sum(l) / len(l)
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用`from __future__ import division`,你可以消除那个丑陋的`float`. (63认同)
  • 另一种消除'丑陋'浮动的方法:`sum(l,0.0)/ len(l)` (39认同)
  • 作为一名C++程序员,这很好,因为地狱和漂浮并不是丑陋的! (25认同)
  • 在python3中,你可以使用`sum(l)/ len(l)` (19认同)
  • 同意.`float`是丑陋的,只是想保持简单. (12认同)
  • 这就是我使用评论而不是更新答案的原因. (2认同)
  • 如果你想减少小数点后的一些数字。这可能会派上用场:```float('%.2f' % float(sum(l) / len(l)))``` (2认同)
  • @Steinfeld 我不认为转换为字符串是最好的方法。您可以使用“round(result, 2)”以更简洁的方式实现相同的效果。 (2认同)

Her*_*rms 496

如果你的减少已经归还你的金额,那么你剩下要做的就是分裂.

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

import statistics
statistics.mean(l)  # 20.11111111111111
Run Code Online (Sandbox Code Playgroud)

虽然statistics.mean()会更简单,因为你不需要lambda.

如果你想要一个更精确的float结果而不是int,那么只需使用len而不是reduce.

  • 如果列表由int组成,则python 2下的结果将为int (9认同)
  • 正如我所说,我是新手,我想我必须用循环或其他东西来计算它中的数字量,我没有意识到我可以只使用长度.这是我用python做的第一件事.. (7认同)
  • @FooBarUser然后你应该计算k = 1.0/len(l),然后减少:reduce(lambda x,y:x + y*k,l) (5认同)
  • 如果总和是一个不适合int/float的大数? (2认同)

Aka*_*all 271

或者你可以使用numpy.mean:

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

import numpy as np
print(np.mean(l))
Run Code Online (Sandbox Code Playgroud)

  • 好吧,除非这是安装numpy的唯一原因.安装一个16mb C包的任何名气进行平均计算在这个规模上看起来很奇怪. (11认同)
  • 哦,但是`np.array(l).mean()`更快*. (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`. (8认同)
  • 真奇怪.我本以为这会更有效率,但是在一个随机的浮动列表中它看起来要花费8倍,而不仅仅是`sum(l)/ len(l)` (4认同)

Mar*_*agh 228

python 3.4中添加了一个统计模块.它有一个函数来计算所谓的平均平均值.您提供的列表的示例如下:

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

  • 这是最优雅的答案,因为它采用了自python 3.4以来可用的标准库模块. (27认同)
  • 它在数值上更稳定 (4认同)

kin*_*all 44

reduce()当Python具有完美的sum()功能时,你为什么要使用它呢?

print sum(l) / float(len(l))
Run Code Online (Sandbox Code Playgroud)

(这float()是迫使Python进行浮点除法的必要条件.)

  • 对于我们这些新手来说['cromulent']这个词(http://nl.urbandictionary.com/define.php?term=cromulent) (33认同)
  • Python 3 上不需要 `float()`。 (2认同)

Che*_*rma 35

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

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

你可以使用像这样的平均方法.假设您有一个您想要找到的数字列表: -

list = [11, 13, 12, 15, 17]
import statistics as s
s.mean(list)
Run Code Online (Sandbox Code Playgroud)

它还有其他方法,如stdev,方差,模式,调和均值,中位数等,这些方法太有用了.


Max*_*amy 18

您可以在总和中添加0.0,而不是强制转换为浮点数:

def avg(l):
    return sum(l, 0.0) / len(l)
Run Code Online (Sandbox Code Playgroud)


And*_*ark 10

sum(l) / float(len(l)) 是正确的答案,但为了完整性,您可以通过单一减少来计算平均值:

>>> reduce(lambda x, y: x + y / float(len(l)), l, 0)
20.111111111111114
Run Code Online (Sandbox Code Playgroud)

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

>>> sum(l) / float(len(l))
20.111111111111111
Run Code Online (Sandbox Code Playgroud)


小智 8

我尝试使用上面的选项,但没有奏效.试试这个:

from statistics import mean

n = [11, 13, 15, 17, 19]
print(n)
print(mean(n))
Run Code Online (Sandbox Code Playgroud)

在python 3.5上工作


Alo*_*man 8

在效率和速度方面,这些是我测试其他答案的结果:

# test mean caculation

import timeit
import statistics
import numpy as np
from functools import reduce
import pandas as pd

LIST_RANGE = 10000000000
NUMBERS_OF_TIMES_TO_TEST = 10000

l = list(range(10))

def mean1():
    return statistics.mean(l)


def mean2():
    return sum(l) / len(l)


def mean3():
    return np.mean(l)


def mean4():
    return np.array(l).mean()


def mean5():
    return reduce(lambda x, y: x + y / float(len(l)), l, 0)

def mean6():
    return pd.Series(l).mean()



for func in [mean1, mean2, mean3, mean4, mean5, mean6]:
    print(f"{func.__name__} took: ",  timeit.timeit(stmt=func, number=NUMBERS_OF_TIMES_TO_TEST))
Run Code Online (Sandbox Code Playgroud)

结果:

mean1 took:  0.17030245899968577
mean2 took:  0.002183011999932205
mean3 took:  0.09744236000005913
mean4 took:  0.07070840100004716
mean5 took:  0.022754742999950395
mean6 took:  1.6689282460001778
Run Code Online (Sandbox Code Playgroud)

很明显,赢家是: sum(l) / len(l)

  • 确切地!它还取决于您稍后将用它做什么。在我的工作中,我通常会进行一系列计算,因此在开始时转换为 numpy 并利用 numpy 的快速底层库是有意义的。 (2认同)

U10*_*ard 6

或使用pandasSeries.mean方法:

pd.Series(sequence).mean()
Run Code Online (Sandbox Code Playgroud)

演示:

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

从文档:

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


Pau*_* YC 5

我在 Udacity\xc2\xb4s 问题中有一个类似的问题需要解决。而不是我编码的内置函数:

\n\n
def list_mean(n):\n\n    summing = float(sum(n))\n    count = float(len(n))\n    if n == []:\n        return False\n    return float(summing/count)\n
Run Code Online (Sandbox Code Playgroud)\n\n

比平时要长得多,但对于初学者来说相当具有挑战性。

\n

  • 好的。其他所有答案都没有注意到空列表的危险! (2认同)

leo*_*019 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)
Run Code Online (Sandbox Code Playgroud)


jas*_*ard 5

如果您想获得的不仅仅是平均值(又名平均值),您可以查看 scipy stats:

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)
Run Code Online (Sandbox Code Playgroud)