5

私はPythonの初心者で、リスト内包表記を独学しています。リスト内包表記に変換してきたほぼすべての for ループ コードでうまくやっていますが、非常に単純なループだと思っていたものに行き詰まっています。

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」オブジェクトは添え字を付けることができません」や「+ のサポートされていないオペランド型: '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))

目的は、基本的に sim() に渡されたパラメーターを取得し、0.9 から 1.8 の間の条件で真であることが判明した値のみを 1 ずつ増やしながら、その長さを反復処理することです。その条件の n 個のランダムをそれぞれチェックしようとしています。次に、正しいものだけを合計します。

ちなみに、答えは 0.2 あたりでうまくいくはずです。それを確認したい場合は、0.9 と 1.8 の間に収まる唯一の方法は 1.5 だと考えてください。

私が学んでいる間、あなたの忍耐に感謝します。

4

1 に答える 1

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.0必要がありますがfloat(len(y))、それはあなたの例から完全には明らかではありません。

1000.0orを使用float(len(y))して、整数除算を使用しないようにします。これにより0、答えが得られます。または、除算演算子がデフォルトで浮動小数点除算を使用from __future__ import divisionするようにするために使用できます。 PEP 238を参照してください。/

最初にリストを保存する必要はありません。

于 2012-11-17T21:46:58.307 に答える