Finding the average of a list

前端 未结 23 1602
抹茶落季
抹茶落季 2020-11-22 11:07

I have to find the average of a list in Python. This is my code so far

l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print reduce(lambda x, y: x + y, l)
相关标签:
23条回答
  • 2020-11-22 11:39

    I had a similar question to solve in a Udacity´s problems. Instead of a built-in function i coded:

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

    Much more longer than usual but for a beginner its quite challenging.

    0 讨论(0)
  • 2020-11-22 11:40

    There is a statistics library if you are using python >= 3.4

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

    You may use it's mean method like this. Let's say you have a list of numbers of which you want to find mean:-

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

    It has other methods too like stdev, variance, mode, harmonic mean, median etc which are too useful.

    0 讨论(0)
  • 2020-11-22 11:42

    sum(l) / float(len(l)) is the right answer, but just for completeness you can compute an average with a single reduce:

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

    Note that this can result in a slight rounding error:

    >>> sum(l) / float(len(l))
    20.111111111111111
    
    0 讨论(0)
  • 2020-11-22 11:42

    In terms of efficiency and speed, these are the results that I got testing the other answers:

    # 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))
    

    and the results:

    mean1 took:  0.17030245899968577
    mean2 took:  0.002183011999932205
    mean3 took:  0.09744236000005913
    mean4 took:  0.07070840100004716
    mean5 took:  0.022754742999950395
    mean6 took:  1.6689282460001778
    

    so clearly the winner is: sum(l) / len(l)

    0 讨论(0)
  • 2020-11-22 11:45

    A statistics module has been added to python 3.4. It has a function to calculate the average called mean. An example with the list you provided would be:

    from statistics import mean
    l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
    mean(l)
    
    0 讨论(0)
  • 2020-11-22 11:45

    In order to use reduce for taking a running average, you'll need to track the total but also the total number of elements seen so far. since that's not a trivial element in the list, you'll also have to pass reduce an extra argument to fold into.

    >>> 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
    
    0 讨论(0)
提交回复
热议问题