Mit sum
undberechnen Sie einfach einen Durchschnitt aus einem Zustandnach dem Verwenden eines Listenverständnisses zum Filtern. Um zum Beispiel die durchschnittliche mpg
zu berechnen, wo es vier cylinders
sind, könnten Sie tun:
mpg4cylinder = [m for m, c in zip(mpg, cylinder) if c == 4]
# For greater precision with float summing, you may want to use math.fsum
cylinder4avg = sum(mpg4cylinder)/len(mpg4cylinder)
Wenn Sie moderne Python (3.4+) verwenden, ist es noch einfacher mit the statistics
module:
cylinder4avg = statistics.mean(m for m, c in zip(mpg, cylinder) if c == 4)
Das ist sogar genauer als math.fsum
Ansätze und prägnanter, im Gegenzug für langsamer.
Dies ist etwas ineffizient, wenn Sie Statistiken für alle Zylinder berechnen, nicht nur ein oder zwei. Sie könnten auf diese verbessern, indem sie durch den Zylinder Gruppierung, wie Sie gehen:
from collections import defaultdict
cyl_to_mpgs = defaultdict(list)
for m, c in zip(mpg, cylinder):
cyl_to_mpgs[c].append(m)
Jetzt können Sie die Mittelwert für eine bestimmte Zylinderzahl erhalten, ohne dass durch die ganze Liste von Daten zu suchen, die Bits zum Ausfiltern Sie wollen, Sie gerade tun:
statistics.mean(cyl_to_mpgs[4.0])
die billig das vorgefilterte list
bekommt (alle Zylinder-Kombinationen in einem einzigen Durchgang vorne vorgefilterten haben).
FYI, Python kann einen Großteil der Arbeit für Sie prägnanter machen. Die Schaffung und Bevölkerung von dataset
könnte nur sein:
# newline='' is the correct way to do csv in Py3; on Py2, you'd get rid of it
# but provide a mode argument of "rb"
with open('auto-mpg-data.csv', newline='') as f:
dataset = list(csv.reader(f))
mpg
wäre:
mpg = [float(row[0]) for row in dataset]
mit dem gleichen Muster für cylinder
. Schleifen, die nichts als append
Werte nacheinander ausführen, werden normalerweise am besten durch den list
Konstruktor oder ein Listenverständnis ersetzt (wenn list
bereits Werte hat, würden Sie extend
mit den gleichen Argumenten oder Verständnis aufrufen wie list
/listcomps).
Und deine Frage ist ...? – Julien