2016-08-23 2 views

Antwort

0

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

+0

geben Sie einfach den Gesamtdurchschnitt von mpg. Ich suche den durchschnittlichen mpg, der den ähnlichen Zylinder hat. Wie Zylinder 4 = 14 + 45 + 23/3 Zylinder 6 = 26 und Zylinder 8 = 21 + 23/2 – Cool

+0

@Cool: Warum werden Zylinder als 'float' geparst, wenn sie' int' sind? Auf jeden Fall werde ich updaten. – ShadowRanger

Verwandte Themen