2012-11-17 16 views
5

Python'a yeni başlıyorum ve kendimi okuduğumu anladım. Anladığım kadarıyla kodun hemen hemen bütününde iyi bir şekilde çalışıyordum. Anladığım kadarıyla okuduğumu anladım, ama oldukça basit bir döngü olduğunu düşündüğüm şeye çok takıldım.Python kavrayışını listelemek için döngü

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

Şimdiye kadar aşağıdaki varyasyonlarını çalışıyordum ama böyle " 'int' nesne unsubscriptable olduğu" ve "desteklenmeyen işlenen türü (ler) için + olarak listelerin kullanımına ilişkin tüm alma hataları var: 'int' ve 'list' '.

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

amacı temelde (sim iletilen parametre almak) ve 0.9 ve 1.8 arasındaki bir durumda sadece bu değerler için 1 doğru bulundu artan ise bunun uzunluğu boyunca yineleme etmektir. Bu durum için her n rastgele kontrol etmeye çalışıyorum. Sonra sadece doğru olanları topla. Bu arada

, cevap 0.2 çevresinde çalışmalıdır - bunu sadece yaklaşık 1.5 olmak tek yolu 0.9 ve 1.8 arasında uyacak şekilde düşünmek kontrol etmek istiyorsanız. Ben öğreniyorum olarak

Ben teşekkür ederiz.

cevap

6

Hala her döngü için bir ifade sağlamak gerekir ve sizin for y in bölüm ziyade el dışında. Aşağıdaki işler:

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

Bu eşdeğerdir: Belki 10000.0float(len(y)) olmalıdır

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

ama bu senin örnekten tamamen net değil.

Biz cevap olarak 0 neden olacaktır tamsayı bölme, kullanmaktan kaçınmak için 1000.0 veya float(len(y)) kullanın. Alternatif olarak, / bölüm operatörünün varsayılan olarak float bölümünü kullanmasını sağlamak için from __future__ import division'u kullanabilirsiniz, bkz. PEP 238. Senin için o ilk listesini depolamak için gerek bir jeneratör ifadesini yapılan

Not.

+0

Teşekkür Martijn ama görünmüyor özetlenebilir bütün numaraları almak gibi. 0,00 sonuç döndürüyor. 0.9 stackuser

+0

@stackuser: ah, çünkü bu tamsayı bölümüdür; bunun yerine bölme yapmak için düzeltildi. –

+0

@stackuser: Versiyonumu dene .. '' '' '' ın bir indeksi değil, '' 'den gelen bir değerdir. Kod, '' '' üzerinden değil, '' '' ('' '' '' '' '' '' '' '' '' '' lo '' lo lo lo lo lo lo .. .. –