665 Stimmen

Ermitteln des Durchschnitts einer Liste

Wie finde ich den Mittelwert einer Liste in Python?

[1, 2, 3, 4]    2.5

39voto

Chetan Sharma Punkte 1390

Es gibt eine Statistikbibliothek, wenn Sie Python >= 3.4 verwenden

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

Sie können die mittlere Methode wie folgt verwenden. Nehmen wir an, Sie haben eine Liste von Zahlen, aus der Sie den Mittelwert ermitteln möchten.

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

Es hat auch andere Methoden wie stdev, Varianz, Modus, harmonisches Mittel, Median usw., die sehr nützlich sind.

19voto

Maxime Chéramy Punkte 16289

Anstatt nach float zu gießen, können Sie 0,0 zur Summe hinzufügen:

def avg(l):
    return sum(l, 0.0) / len(l)

16voto

Alon Gouldman Punkte 2343

EDIT:

Ich habe zwei weitere Möglichkeiten hinzugefügt, um den Durchschnitt einer Liste zu ermitteln (die nur für Python 3.8+ relevant sind). Hier ist der Vergleich, den ich gemacht habe:

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

LIST_RANGE = 10
NUMBERS_OF_TIMES_TO_TEST = 10000

l = list(range(LIST_RANGE))

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

def mean7():
    return statistics.fmean(l)

def mean8():
    return math.fsum(l) / len(l)

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

Dies sind die Ergebnisse, die ich erhalten habe:

mean1 took:  0.09751558300000002
mean2 took:  0.005496791999999973
mean3 took:  0.07754683299999998
mean4 took:  0.055743208000000044
mean5 took:  0.018134082999999968
mean6 took:  0.6663848750000001
mean7 took:  0.004305374999999945
mean8 took:  0.003203333000000086

Interessant! Sieht aus wie math.fsum(l) / len(l) der schnellste Weg ist, dann statistics.fmean(l) und erst dann sum(l) / len(l) . Schön!

Danke @Asclepius, dass du mir diese beiden anderen Wege gezeigt hast!


ALTE ANTWORT:

In Bezug auf Effizienz und Geschwindigkeit sind dies die Ergebnisse, die ich beim Testen der anderen Antworten erhalten habe:

# test mean caculation

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

LIST_RANGE = 10
NUMBERS_OF_TIMES_TO_TEST = 10000

l = list(range(LIST_RANGE))

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

und die Ergebnisse:

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

Der Gewinner ist also eindeutig: sum(l) / len(l)

11voto

Ngury Mangueira Punkte 99

Ich habe es mit den oben genannten Optionen versucht, aber es hat nicht funktioniert. Versuchen Sie dies:

from statistics import mean

n = [11, 13, 15, 17, 19]

print(n)
print(mean(n))

arbeitete mit Python 3.5

11voto

Andrew Clark Punkte 193562

sum(l) / float(len(l)) ist die richtige Antwort, aber nur der Vollständigkeit halber können Sie einen Durchschnitt mit einer einzigen Reduktion berechnen:

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

Beachten Sie, dass dies zu einem leichten Rundungsfehler führen kann:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X