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?
sum(L) / float(len(L))
.if not L: ...
Antworten:
Unter Python 3.4+ können Sie verwenden
statistics.mean()
Auf älteren Versionen von Python können Sie dies tun
In Python 2 müssen Sie
len
in einen Float konvertieren , um die Float-Division zu erhaltenEs besteht keine Notwendigkeit zu verwenden
reduce
. Es ist viel langsamer und wurde entfernt in Python 3.quelle
quelle
from __future__ import division
, können Sie das hässliche beseitigenfloat
.float
ist höllisch hässlich, wollte es nur einfacher halten.sum(l, 0.0) / len(l)
sum(l) / len(l)
Sie können verwenden
numpy.mean
:quelle
sum(l)/len(l)
np.array(l).mean()
ist viel schneller.np.mean(l)
undnp.array(l).mean
sind etwa die gleiche Geschwindigkeit undsum(l)/len(l)
ist doppelt so schnell zu. Ich habe verwendetl = list(np.random.rand(1000))
, natürlich werden beidenumpy
Methoden viel schneller, wenn es sol
istnumpy.array
.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:
quelle
statistics.StatisticsError: mean requires at least one data point
anstelle einer kryptischerenZeroDivisionError: division by zero
für diesum(x) / len(x)
Lösung übergeben.Warum sollten Sie
reduce()
dies verwenden, wenn Python eine perfekt cromulentesum()
Funktion hat?(Dies
float()
ist erforderlich, um Python zu einer Gleitkommadivision zu zwingen.)quelle
float()
ist auf Python 3 nicht erforderlich.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: -
Es gibt auch andere Methoden wie stdev, Varianz, Modus, harmonisches Mittel, Median usw., die zu nützlich sind.
quelle
Anstatt zu schweben, um zu schweben, können Sie der Summe 0,0 hinzufügen:
quelle
sum(l) / float(len(l))
ist die richtige Antwort, aber der Vollständigkeit halber können Sie einen Durchschnitt mit einer einzigen Reduzierung berechnen:Beachten Sie, dass dies zu einem leichten Rundungsfehler führen kann:
quelle
reduce()
das Sie False für eine leere Liste erhalten würden, andernfalls den Durchschnitt wie zuvor.float
auflen
?Ich habe versucht, die oben genannten Optionen zu verwenden, aber es hat nicht funktioniert. Versuche dies:
arbeitete an Python 3.5
quelle
Oder verwenden Sie
pandas
dieSeries.mean
Methode:Demo:
Aus den Dokumenten:
Und hier sind die Dokumente dafür:
Und die gesamte Dokumentation:
quelle
Ich hatte eine ähnliche Frage bei den Problemen eines Udacity zu lösen. Anstelle einer eingebauten Funktion habe ich codiert:
Viel länger als gewöhnlich, aber für Anfänger ist es eine ziemliche Herausforderung.
quelle
False
(entspricht der Ganzzahl0
) ist der schlechteste Weg, um diesen Fehler zu behandeln. Besser fangenZeroDivisionError
und etwas Besseres (vielleichtValueError
) aufziehen .ValueError
besser als einZeroDivisionError
? Letzteres ist spezifischer, und es scheint ein bisschen unnötig, einen Rechenfehler zu fangen, nur um einen anderen erneut zu werfen.ZeroDivisionError
ist 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.Als Anfänger habe ich gerade Folgendes codiert:
quelle
sum(l)/len(l)
ist bei weitem die eleganteste Antwort (in Python 3 müssen keine Typkonvertierungen vorgenommen werden).Wenn Sie mehr als nur den Mittelwert (auch bekannt als Durchschnitt) erhalten möchten, können Sie sich die Scipy-Statistiken ansehen
quelle
Um
reduce
einen 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 auchreduce
ein zusätzliches Argument übergeben, um es zu falten.quelle
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.
Gleitende Werte
@ Andrew Clark war korrekt in seiner Aussage.
quelle
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
x
Dimension 3 * 10 hat, wenn Sie diemean
zu jeder Zeile erhalten müssen, können Sie dies eingebenvergiss es nicht
import numpy as np
quelle
quelle
Finden Sie den Durchschnitt in der Liste Mit dem folgenden PYTHON- Code:
versuchen Sie es einfach.
quelle
oder wie zuvor gepostet
Die 1.0 soll sicherstellen, dass Sie eine Gleitkommadivision erhalten
quelle
Wenn ich einige der oben genannten Antworten kombiniere, habe ich Folgendes gefunden, das mit Reduzieren funktioniert und nicht davon ausgeht, dass Sie
L
innerhalb der Reduktionsfunktion verfügbar sind:quelle
Ich möchte nur einen weiteren Ansatz hinzufügen
quelle
quelle