2012-11-17 17 views
5

Ich bin ein Anfänger zu Python und lehre mich Listen-Comprehensions. Ich habe mich mit fast allen For-Loop-Codes, die ich übersetzt habe, gut geschlagen, aber ich bin sehr auf dem zurückgeblieben, was ich für eine ziemlich einfache Schleife hielt.Python for-loop zum Verständnis der Liste

n = 10000 

def sim(y): 
    count = 0 
    for i in range(10000): 
    if 0.9 <= y[i] <= 1.8: 
     count += 1 
    probability = count/10000.0 
    print("P(a < x <= b) : {0:8.4f}".format(probability)) 


print ("\t case: \n"),sim([0.25 if random() < 0.8 else 1.5 for r in range(n)]) 

Bisher habe ich auf den folgenden Variationen versucht, aber es ist alles immer Fehler auf die Verwendung von Listen im Zusammenhang wie „‚int‘Objekt ist unsubscriptable“ und „nicht unterstützte Operandtyp (e) für +: 'int' und 'liste' ".

def sim(y): 
    c4 = sum([y for range(y) in range(len(y)) if 0.9 < y[i] <= 1.8])/10000 
    print("P(a < x <= b) : {0:8.4f}".format(c4)) 

ist der Zweck im Grunde um den Parameter sim() und iterieren über die Länge der übergebenen zu nehmen, während von 1 nur für die Werte, die durch den Zustand zwischen 0,9 und 1,8 Ergebnis erhöht werden wahr. Ich versuche, jedes der n Randoms für diese Bedingung zu überprüfen. Dann summiere nur diejenigen, die wahr sind.

Übrigens sollte die Antwort etwa 0,2 funktionieren - wenn Sie es überprüfen möchten, denken Sie nur, dass 1,5 die einzige Möglichkeit ist, zwischen 0,9 und 1,8 zu passen.

Ich schätze Ihre Geduld, während ich lerne.

Antwort

6

Sie müssen immer noch einen Ausdruck für jede Schleife bereitstellen, und Ihr for y in Abschnitt ist eher außer Kontrolle geraten. Die folgenden Werke:

c4 = sum(1 for i in y if 0.9 < i <= 1.8)/10000.0 

Dies ist das Äquivalent von:

count = 0 
for i in y: 
    if 0.9 < i <= 1.8: 
     count += 1 
c4 = count/10000.0 

Vielleicht ist die 10000.0 sollte float(len(y)) sein, aber das ist nicht ganz klar aus Ihrem Beispiel.

Wir verwenden 1000.0 oder float(len(y)), um die Verwendung einer Ganzzahldivision zu vermeiden, die 0 als die Antwort ergeben würde. Alternativ können Sie from __future__ import division verwenden, um den /-Divisionsoperator standardmäßig die Float-Division zu verwenden, siehe PEP 238.

Beachten Sie, dass ich es zu einem Generator Ausdruck für Sie gemacht habe, keine Notwendigkeit, eine Liste zuerst zu speichern.

+0

Danke Martijn, aber es scheint nicht alle Zahlen summiert zu bekommen. Es gibt 0.00 Ergebnis zurück. Ich habe versucht 0.9 stackuser

+0

@ stackuser: Ah, das ist, weil das eine Ganzzahl-Division ist; korrigiert, um stattdessen die Division zu floaten. –

+0

@stackuser: Versuche meine Version .. 'i' ist kein Index in' y', es ist ein Wert * von * 'y'. Der Code läuft über "y" selbst, nicht über einen 'Bereich()'. –

Verwandte Themen