2012-11-17 19 views
5

Sono un principiante di Python e mi sto insegnando a comprendere le liste. Ho fatto bene con quasi tutto il codice for-loop che ho tradotto per elencare la comprensione, ma sono molto bloccato su quello che pensavo fosse un ciclo abbastanza semplice.Python for-loop to list comprehension

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

Finora ho cercato variazioni sul seguente ma è tutti gli errori ottenendo connessi con l'uso di liste, come "oggetto 'int' è unsubscriptable" e "tipo non supportato operando (s) per +: 'int' e 'lista' ".

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

Lo scopo è quello di prendere fondamentalmente il parametro passato sim() e scorrere per tutta la lunghezza di esso mentre incrementare di 1 solo per quei valori trovati vero dalla condizione tra 0,9 e 1,8. Sto provando a controllare ciascuno dei randoms per quella condizione. Quindi somma solo quelli che sono veri.

A proposito, la risposta dovrebbe aggirarsi intorno a 0.2 - se si vuole verificare, basti pensare che 1.5 è l'unico modo per adattarsi tra 0.9 e 1.8.

Apprezzo la tua pazienza mentre sto imparando.

risposta

6

È ancora necessario fornire un'espressione per ogni ciclo e la sezione for y in è piuttosto fuori controllo. Le seguenti opere:

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

questo è l'equivalente di:

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

Forse il 10000.0 dovrebbe essere float(len(y)), ma questo non è del tutto chiaro dal vostro esempio.

Utilizziamo 1000.0 o float(len(y)) per evitare l'uso della divisione integer, che risulterebbe nella risposta 0. In alternativa, è possibile utilizzare from __future__ import division per fare in modo che l'operatore di divisione / utilizzi la divisione float per impostazione predefinita, vedere PEP 238.

Nota che ho creato un'espressione di generatore per te, non è necessario memorizzare prima un elenco.

+0

Grazie Martijn ma non sembra che tutti i numeri siano sommati. Sta restituendo 0,00 risultati. Ho provato 0.9 stackuser

+0

@stackuser: ah, questo perché questa è una divisione intera; corretto per renderlo float division invece. –

+0

@stackuser: prova la mia versione .. 'i' non è un indice in' y', è un valore * di * 'y'. Il codice scorre su 'y' stesso, non su un' range() '.. –

Problemi correlati