2012-11-17 30 views
5

मैं पाइथन के लिए एक नौसिखिया हूं और खुद को सूची की समझ पढ़ रहा हूं। मैं लगभग सभी फॉर-लूप कोड के साथ अच्छा प्रदर्शन कर रहा हूं, मैं सूची समझने के लिए अनुवाद कर रहा हूं, लेकिन जो मैंने सोचा था वह काफी सरल लूप था।पाइथन फॉर-लूप समझने के लिए

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

अब तक मैं निम्नलिखित में बदलाव की कोशिश कर रहा है, लेकिन यह जैसे कि " 'int' वस्तु unsubscriptable है" और "का समर्थन नहीं संकार्य प्रकार (ओं) + सूचियों के उपयोग से संबंधित सभी हो रही त्रुटियों है: 'int' और '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)) 

उद्देश्य मूल रूप से पैरामीटर सिम पारित कर दिया() लेने के लिए और इसके बारे में लंबाई से अधिक पुनरावृति 0.9 और 1.8 के बीच हालत से पाया केवल उन मूल्यों के लिए 1 से incrementing जबकि सच है। मैं उस स्थिति के लिए प्रत्येक एन रैंडम की जांच करने की कोशिश कर रहा हूं। फिर केवल उन लोगों को योग करें जो सत्य हैं।

वैसे, इस सवाल का जवाब 0.2 चारों ओर बाहर काम करना चाहिए - आप यह सिर्फ लगता है 0.9 और 1.8 के बीच फिट करने के लिए लगभग 1.5 जा रहा है एक ही तरीका है की जाँच करना चाहते हैं।

मैं के रूप में मैं सीख रहा हूँ आपके धैर्य की सराहना।

उत्तर

6

तुम अब भी प्रत्येक पाश के लिए एक अभिव्यक्ति प्रदान करने की आवश्यकता है, और अपने for y in अनुभाग बल्कि हाथ से बाहर है। निम्नलिखित काम करता है:

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

इस के बराबर है:

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

शायद 10000.0float(len(y)) होना चाहिए, लेकिन है कि अपने उदाहरण से पूरी तरह से स्पष्ट नहीं है।

हम पूर्णांक विभाजन का उपयोग करने से बचने के लिए 1000.0 या float(len(y)) का उपयोग करते हैं, जिसके परिणामस्वरूप 0 उत्तर के रूप में होगा। वैकल्पिक रूप से, आप का उपयोग / डिवीजन ऑपरेटर डिफ़ॉल्ट रूप से फ्लोट डिवीजन का उपयोग करने के लिए कर सकते हैं, PEP 238 देखें।

ध्यान दें कि मैं इसे आप के लिए एक जनरेटर अभिव्यक्ति बनाया है, पहले एक सूची संग्रहीत करने की कोई जरूरत।

+0

धन्यवाद मार्टिजन लेकिन ऐसा लगता है कि यह सभी संख्याओं को सारांशित नहीं किया जा रहा है। यह 0.00 परिणाम लौट रहा है। मैंने 0.9 stackuser

+0

@ स्टैक्यूसर: आह, ऐसा इसलिए है क्योंकि यह पूर्णांक विभाजन है; इसे इसके बजाय फ्लोट विभाजन बनाने के लिए सही किया गया। –

+0

@ स्टैक्यूसर: मेरा संस्करण आज़माएं .. 'i'' y' में कोई अनुक्रमणिका नहीं है, यह * 'y' से एक मान * है। कोड 'y' से अधिक हो जाता है, न कि' रेंज() '.. –