# Calculating arithmetic mean (one type of average) in Python [duplicate]

Each Answer to this Q is separated by one/two green lines.

Is there a built-in or standard library method in Python to calculate the arithmetic mean (one type of average) of a list of numbers?

I am not aware of anything in the standard library. However, you could use something like:

``````def mean(numbers):
return float(sum(numbers)) / max(len(numbers), 1)

>>> mean([1,2,3,4])
2.5
>>> mean([])
0.0
``````

In numpy, there’s `numpy.mean()`.

NumPy has a `numpy.mean` which is an arithmetic mean. Usage is as simple as this:

``````>>> import numpy
>>> a = [1, 2, 4]
>>> numpy.mean(a)
2.3333333333333335
``````

``````import statistics
print(statistics.mean([1,2,4])) # 2.3333333333333335
``````

It’s available since Python 3.4. For 3.1-3.3 users, an old version of the module is available on PyPI under the name `stats`. Just change `statistics` to `stats`.

You don’t even need numpy or scipy…

``````>>> a = [1, 2, 3, 4, 5, 6]
>>> print(sum(a) / len(a))
3
``````

Use scipy:

``````import scipy;
a=[1,2,4];
print(scipy.mean(a));
``````

Instead of casting to float you can do following

``````def mean(nums):
return sum(nums, 0.0) / len(nums)
``````

or using lambda

``````mean = lambda nums: sum(nums, 0.0) / len(nums)
``````

Python 3.8 added function fmean to statistics module. Which is faster and always returns float.

Convert data to floats and compute the arithmetic mean.

This runs faster than the mean() function and it always returns a
float. The data may be a sequence or iterable. If the input dataset is
empty, raises a StatisticsError.

fmean([3.5, 4.0, 5.25])

4.25

New in version 3.8.

``````from statistics import mean
avarage=mean(your_list)
``````

for example

``````from statistics import mean

my_list=[5,2,3,2]
avarage=mean(my_list)
print(avarage)
``````

and result is

``````3.0
``````

If you’re using python >= 3.8, you can use the `fmean` function introduced in the `statistics` module which is part of the standard library:

``````>>> from statistics import fmean
>>> fmean([0, 1, 2, 3])
1.5
``````

It’s faster than the `statistics.mean` function, but it converts its data points to `float` beforehand, so it can be less accurate in some specific cases.

You can see its implementation here

``````def avg(l):
"""uses floating-point division."""
return sum(l) / float(len(l))
``````

### Examples:

``````l1 = [3,5,14,2,5,36,4,3]
l2 = [0,0,0]

print(avg(l1)) # 9.0
print(avg(l2)) # 0.0
``````

``````def list_mean(nums):
sumof = 0
num_of = len(nums)
mean = 0
for i in nums:
sumof += i
mean = sumof / num_of
return float(mean)
``````

I always supposed `avg` is omitted from the builtins/stdlib because it is as simple as

``````sum(L)/len(L) # L is some list
``````

and any caveats would be addressed in caller code for local usage already.

Notable caveats:

1. non-float result: in python2, 9/4 is 2. to resolve, use `float(sum(L))/len(L)` or `from __future__ import division`

2. division by zero: the list may be empty. to resolve:

``````if not L:
raise WhateverYouWantError("foo")
avg = float(sum(L))/len(L)
``````

The proper answer to your question is to use `statistics.mean`. But for fun, here is a version of mean that does not use the `len()` function, so it (like `statistics.mean`) can be used on generators, which do not support `len()`:

``````from functools import reduce
from operator import truediv
def ave(seq):
return truediv(*reduce(lambda a, b: (a[0] + b[1], b[0]),
enumerate(seq, start=1),
(0, 0)))
``````

Others already posted very good answers, but some people might still be looking for a classic way to find Mean(avg), so here I post this (code tested in Python 3.6):

``````def meanmanual(listt):

mean = 0
lsum = 0
lenoflist = len(listt)

for i in listt:
lsum += i

mean = lsum / lenoflist
return float(mean)

a = [1, 2, 3, 4, 5, 6]
meanmanual(a)