2017-12-07 4 views
0

この関数は、ウイルスが死ぬ可能性を表す[ATCG、GTAC .....]やmortalityProb(0〜1の間の浮動小数点数) /リストから削除する。残りのウィルスで新しいリストを返すべきです。それぞれのウイルスは死亡する可能性があるため、死亡率が0.6となると、残りのウイルスの約60%が残っているはずです。ランダムに生成された番号に応じてリストから要素を削除する

これは、リスト内包表記を使用して2行(def kill(viruses、mortalityProb):)と私のコード行で行うことができます。

def kill(viruses, mortalityProb): 
    for i in viruses: 
     if random.randint(0, 100) < (mortalityProb * 100): 
      del i 
    return viruses 

これはうまくいきませんが、理由はわかりません。これを行うには

+2

「del i」は「i変数」の割り当てを解除することを意味します。それ以上のことはしません。どのリストからもオブジェクトは削除されません。 – user2357112

+1

これを行う1つの方法は 'viruses.remove(i)'です。しかし、それを反復している間にリストを変更する際のさまざまな投稿を見てください。 – Prune

+1

@プルーンは、美しい答えを与えましたが、あなたの頭の中に、1ライナーを書くことはpythonic *方法ではなく、読みやすいコードを書くことがベストプラクティスです!しかし、@ Pruneの答えはまだ読み込み可能ですが、 'import random'の代わりに' random import'をインポートすることもできますが、 'random.random()'の代わりに 'random()'を使ってスペースを節約することができます赤字性を高めます。 – Lycopersicum

答えて

3

一つの方法は、ウイルスであります

これを1つのライナーにすることができますが、ウイルスごとにrandomと呼ぶだけで、それを含めることができます。セービングスロー "が動作します。

return [i for i in viruses if random.random() < mortalityProb] 
例えば

mortalityProbは、生物が生き残り、ない死亡の可能性を記述する必要があります。

>>> viruses = [x for x in range(20)] 
>>> [i for i in viruses if random.random() < 0.75] 
[0, 1, 3, 6, 7, 9, 10, 11, 12, 13, 15, 17, 18, 19] 

はところで、あなたはあなたの変数がmisnamed持っています。

0

ため、「i」は、実際にリストの要素ではないforループで。あなたが実際にウイルスのリストを変更する必要があります。このような何かが動作する可能性があります。

def kill(viruses, mortalityProb): 
    for x,i in enumerate(viruses): 
     if random.randint(0, 100) < (mortalityProb * 100): 
      viruses.pop(x) 
    return viruses 
+0

通常、リストを繰り返している間はリストを編集する必要はありません。あなたが気をつけなければ何らかの不思議さを引き起こすことができます。 – MCBama

+0

それは本当です。私はそれがいつ問題になるのか、そうでないのかを決して覚えていない。 – SuperStew

+0

これは、アイテムを取得するために上部を飛ばしたスタック/キューを使用している場合を除き、通常は常に問題です。ポッピングはオブジェクトを変更しますが、上から引っ張るだけで問題にはなりません。 – MCBama

関連する問題