Den Durchschnitt einer Liste ermitteln


473

Ich muss den Durchschnitt einer Liste in Python finden. Dies ist mein bisheriger Code

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

Ich habe es so, dass es die Werte in der Liste addiert, aber ich weiß nicht, wie ich es in sie aufteilen soll?


45
numpy.mean, wenn Sie es sich leisten können, numpy
mitch

7
sum(L) / float(len(L)). if not L: ...
Behandeln Sie

4
@mitch: Es geht nicht darum, ob Sie es sich leisten können, numpy zu installieren. Numpy ist ein ganzes Wort für sich. Es ist, ob Sie tatsächlich numpy brauchen. Die Installation von numpy, einer 16-MB-C-Erweiterung, für die mittlere Berechnung wäre für jemanden, der sie nicht für andere Zwecke verwendet, sehr unpraktisch.
n611x007

3
Anstatt das gesamte numpy-Paket für nur avg / mean zu installieren, wenn wir Python 3 verwenden, können wir dies mit dem Statistikmodul nur durch "from statististic import mean" erledigen. Wenn Sie Python 2.7 oder weniger verwenden, kann das Statistikmodul von src heruntergeladen werden: hg.python.org/cpython/file/default/Lib/statistics.py doc: docs.python.org/dev/library/statistics.html und direkt verwendet.
25 MHz

Antworten:


568

Unter Python 3.4+ können Sie verwenden statistics.mean()

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

import statistics
statistics.mean(l)  # 20.11111111111111

Auf älteren Versionen von Python können Sie dies tun

sum(l) / len(l)

In Python 2 müssen Sie lenin einen Float konvertieren , um die Float-Division zu erhalten

sum(l) / float(len(l))

Es besteht keine Notwendigkeit zu verwenden reduce. Es ist viel langsamer und wurde entfernt in Python 3.


9
Wenn die Liste aus Ints besteht, ist das Ergebnis unter Python 2 ein Int
Mitch

Das ist perfekt ! Entschuldigung für die dumme Frage, aber ich habe wirklich überall danach gesucht! ich danke dir sehr !
Carla Dessi

7
Wie gesagt, ich bin neu in diesem Bereich. Ich dachte, ich müsste es mit einer Schleife oder so machen, um die Anzahl der Zahlen zu zählen. Ich wusste nicht, dass ich nur die Länge verwenden kann. Dies ist das erste, was ich mit Python gemacht habe ..
Carla Dessi

2
Was ist, wenn die Summe eine massive Zahl ist, die nicht in int / float passt?
Foo Bar Benutzer

5
@FooBarUser dann sollten Sie k = 1,0 / len (l) berechnen und dann reduzieren: reduzieren (Lambda x, y: x + y * k, l)
Arseniy

519
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
sum(l) / len(l)

63
Wenn Sie verwenden from __future__ import division, können Sie das hässliche beseitigen float.
S.Lott

12
Einverstanden. floatist höllisch hässlich, wollte es nur einfacher halten.
Yprez

39
Eine andere Möglichkeit, diesen "hässlichen" Schwimmer zu beseitigen:sum(l, 0.0) / len(l)
Remosu

26
Als C ++ - Programmierer ist das verdammt ordentlich und Float ist überhaupt nicht hässlich!
Lahjaton_j

20
In Python3 können Sie einfach verwendensum(l) / len(l)
VasiliNovikov

283

Sie können verwenden numpy.mean:

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

import numpy as np
print(np.mean(l))

4
Das ist seltsam. Ich hätte angenommen, dass dies viel effizienter wäre, aber es scheint auf einer zufälligen Liste von Floats achtmal so lange zu dauern wie einfachsum(l)/len(l)
L. Amber O'Hearn

8
Oh, aber np.array(l).mean()ist viel schneller.
L. Amber O'Hearn

8
@ L.AmberO'Hearn, timed ich es einfach und np.mean(l)und np.array(l).meansind etwa die gleiche Geschwindigkeit und sum(l)/len(l)ist doppelt so schnell zu. Ich habe verwendet l = list(np.random.rand(1000)), natürlich werden beide numpyMethoden viel schneller, wenn es so list numpy.array.
Akavall

11
Nun, es sei denn, dies ist der einzige Grund für die Installation von numpy. Die Installation eines 16-MB-C-Pakets mit dem für die Mittelwertberechnung bekannten Wert sieht in dieser Größenordnung sehr seltsam aus.
n611x007

Aber in meinen Gedanken. Es ist nicht nötig, sich um die Geschwindigkeit in normalem Zustand zu kümmern.
Tyan

230

Eine Statistik - Modul wurde auf Python 3.4 hinzugefügt . Es hat eine Funktion zur Berechnung des als Mittelwert bezeichneten Durchschnitts . Ein Beispiel für die von Ihnen bereitgestellte Liste wäre:

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

28
Dies ist die eleganteste Antwort, da ein Standardbibliotheksmodul verwendet wird, das seit Python 3.4 verfügbar ist.
Serge Stroobandt

4
Und es ist zahlenmäßig stabiler
Antti Haapala

Und es erzeugt einen schöneren Fehler, wenn Sie versehentlich eine leere Liste statistics.StatisticsError: mean requires at least one data pointanstelle einer kryptischeren ZeroDivisionError: division by zerofür die sum(x) / len(x)Lösung übergeben.
Boris

45

Warum sollten Sie reduce()dies verwenden, wenn Python eine perfekt cromulente sum()Funktion hat?

print sum(l) / float(len(l))

(Dies float()ist erforderlich, um Python zu einer Gleitkommadivision zu zwingen.)


34
Für diejenigen von uns, die neu im Wort "cromulent" sind
RolfBly

1
float()ist auf Python 3 nicht erforderlich.
Boris

36

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 diese verwenden. Angenommen, Sie haben eine Liste mit Zahlen, deren Mittelwert Sie ermitteln möchten: -

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

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


18

Anstatt zu schweben, um zu schweben, können Sie der Summe 0,0 hinzufügen:

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

10

sum(l) / float(len(l)) ist die richtige Antwort, aber der Vollständigkeit halber können Sie einen Durchschnitt mit einer einzigen Reduzierung 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

Ich verstehe, dass dies nur zum Spaß ist, aber 0 für eine leere Liste zurückzugeben, ist möglicherweise nicht das Beste
Johan Lundberg

1
@JohanLundberg - Sie könnten die 0 durch False als letztes Argument ersetzen, für reduce()das Sie False für eine leere Liste erhalten würden, andernfalls den Durchschnitt wie zuvor.
Andrew Clark

@ AndrewClark warum zwingst du floatauf len?
EndermanAPM

8

Ich habe versucht, die oben genannten Optionen zu verwenden, aber es hat nicht funktioniert. Versuche dies:

from statistics import mean

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

print(n)
print(mean(n))

arbeitete an Python 3.5


6

Oder verwenden Sie pandasdie Series.meanMethode:

pd.Series(sequence).mean()

Demo:

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

Aus den Dokumenten:

Series.mean(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)

Und hier sind die Dokumente dafür:

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.mean.html

Und die gesamte Dokumentation:

https://pandas.pydata.org/pandas-docs/stable/10min.html


Dies ist keine Pandas-Frage, daher scheint es übertrieben, eine so schwere Bibliothek für eine einfache Operation wie das Finden des Mittelwerts zu importieren.
CS95

4

Ich hatte eine ähnliche Frage bei den Problemen eines Udacity zu lösen. Anstelle einer eingebauten Funktion habe ich codiert:

def list_mean(n):

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

Viel länger als gewöhnlich, aber für Anfänger ist es eine ziemliche Herausforderung.


1
Gut. Bei jeder anderen Antwort wurde die Gefahr einer leeren Liste nicht bemerkt!
wsysuper

1
Die Rückgabe False(entspricht der Ganzzahl 0) ist der schlechteste Weg, um diesen Fehler zu behandeln. Besser fangen ZeroDivisionErrorund etwas Besseres (vielleicht ValueError) aufziehen .
Kindall

@kindall wie ist ein ValueErrorbesser als ein ZeroDivisionError? Letzteres ist spezifischer, und es scheint ein bisschen unnötig, einen Rechenfehler zu fangen, nur um einen anderen erneut zu werfen.
MatTheWhale

Dies ZeroDivisionErrorist nur dann sinnvoll, wenn Sie wissen, wie die Berechnung durchgeführt wird (dh, dass eine Division durch die Länge der Liste vorliegt). Wenn Sie das nicht wissen, erfahren Sie nicht, wo das Problem mit dem übergebenen Wert liegt. Während Ihre neue Ausnahme diese spezifischeren Informationen enthalten kann.
Kindall

4

Als Anfänger habe ich gerade Folgendes codiert:

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)

Bravo: IMHO, sum(l)/len(l)ist bei weitem die eleganteste Antwort (in Python 3 müssen keine Typkonvertierungen vorgenommen werden).
Fralau

4

Wenn Sie mehr als nur den Mittelwert (auch bekannt als Durchschnitt) erhalten möchten, können Sie sich die Scipy-Statistiken ansehen

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)

3

Um reduceeinen laufenden Durchschnitt zu ermitteln, müssen Sie die Gesamtzahl, aber auch die Gesamtzahl der bisher gesehenen Elemente verfolgen. Da dies kein triviales Element in der Liste ist, müssen Sie auch reduceein zusätzliches Argument übergeben, um es zu falten.

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

1
interessant, aber darum hat er nicht gebeten.
Johan Lundberg

3

Mit beiden können Sie nahezu ähnliche Werte für eine Ganzzahl oder mindestens 10 Dezimalwerte erhalten. Wenn Sie jedoch wirklich lange schwebende Werte in Betracht ziehen, können beide unterschiedlich sein. Der Ansatz kann variieren, je nachdem, was Sie erreichen möchten.

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

Gleitende Werte

>>> print reduce(lambda x, y: x + y, l) / float(len(l))
20.1111111111
>>> print sum(l)/float(len(l))
20.1111111111

@ Andrew Clark war korrekt in seiner Aussage.


3

nehme an, dass

x = [[-5.01,-5.43,1.08,0.86,-2.67,4.94,-2.51,-2.25,5.56,1.03], [-8.12,-3.48,-5.52,-3.78,0.63,3.29,2.09,-2.13,2.86,-3.33], [-3.68,-3.54,1.66,-4.11,7.39,2.08,-2.59,-6.94,-2.26,4.33]]

Sie können feststellen, dass xDimension 3 * 10 hat, wenn Sie die meanzu jeder Zeile erhalten müssen, können Sie dies eingeben

theMean = np.mean(x1,axis=1)

vergiss es nicht import numpy as np


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

l = map(float,l)
print '%.2f' %(sum(l)/len(l))

3
Ineffizient. Es konvertiert alle Elemente in Float, bevor sie hinzugefügt werden. Es ist schneller, nur die Länge zu konvertieren.
Chris Koston

1

Finden Sie den Durchschnitt in der Liste Mit dem folgenden PYTHON- Code:

l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print(sum(l)//len(l))

versuchen Sie es einfach.


0
print reduce(lambda x, y: x + y, l)/(len(l)*1.0)

oder wie zuvor gepostet

sum(l)/(len(l)*1.0)

Die 1.0 soll sicherstellen, dass Sie eine Gleitkommadivision erhalten


0

Wenn ich einige der oben genannten Antworten kombiniere, habe ich Folgendes gefunden, das mit Reduzieren funktioniert und nicht davon ausgeht, dass Sie Linnerhalb der Reduktionsfunktion verfügbar sind:

from operator import truediv

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

def sum_and_count(x, y):
    try:
        return (x[0] + y, x[1] + 1)
    except TypeError:
        return (x + y, 2)

truediv(*reduce(sum_and_count, L))

# prints 
20.11111111111111

0

Ich möchte nur einen weiteren Ansatz hinzufügen

import itertools,operator
list(itertools.accumulate(l,operator.add)).pop(-1) / len(l)

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

Was ist, wenn der Benutzer Ihrem Array Gleitkommazahlen hinzufügt? Die Ergebnisse werden sehr ungenau sein.
Flame_Phoenix
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.