2017-10-25 21 views
3

myListのサンプルを作成しようとしましたが、例外はi_です。例外を持つPythonランダムサンプル

私の試み:

i_ = 'd' 

myList = ['a','b','c','d','e'] 

myList = random.sample(myList, 3) 

上記のサンプルが正常に動作しますが、i_myListから削除される可能性がまだあります。

i_の値を削除せずにサンプルを作成したいと思います。

所望の出力:

i_を含む3つの項目、例えば含む任意のリスト出力:i_はその後、1つの少なくランダムな要素を取り、リストになること

['a','d','e'] 
+0

これはランダムが設計されたものではありません。あなたができることは '_i'があなたのリストにあることを保証する' [_i] + random.sample(myList、3) 'のようなものです。 – Peter

+0

サンプルを描画して手動で追加する前に、最初のリストからi_を削除できますか? –

答えて

5

ただ、サンプル2つの値と、後でi_を挿入します。

new_list = random.sample([i for i in myList if i != i_], 2) 
new_list.insert(random.randrange(0, 3), i_) 

をしかし、これはi_は一度だけあなたのリストで発生することを前提として - あなたの例で与えられた合理的なようだが、私はこれを言及したかったです完全。また、リストに複数のi_があった場合、希望する結果がどうなるかはわかりません。それはi_が中に描かれている可能性は低い場合、これは非常に遅くなり得ること

new_list = [] 
while i_ not in new_list: 
    new_list = random.sample(myList, 3) 

注意:あなたがi_が含まれているものを取得するまで、あなたはまた、サンプルを生成ヒット&ミスアプローチを使用することができ


標本、見本。 5つの要素からなる3つのサンプルの場合、非常に高速ですが、1000要素から3つのサンプルを描画すると、は本当に遅いになります。ドキュメントから

+0

2番目の考えではうまくいかないようですが、エラーが発生しています:new_list.insert(i_、random.randrange(0、3)) TypeError:整数が必要です – LearningToPython

+0

@LearningToPythonそれを持ってきてくれてありがとう。私は引数をスワップしました:(今すぐ修正されました – MSeifert

+0

ああ、ありがとう!ありがとう=) – LearningToPython

2

保証。

myList.remove(i_) 
myList = random.sample(myList, 2) 
myList.append(i_) 

必要に応じて1行にまとめることができます。 i_なしのリストから

+0

これの欠点は、 'i_'は常にランダムサンプルの最後にあることです。 –

+0

問題がある場合は、ランダムな場所に挿入するだけです。 – Prune

+0

ありがとう! ;) 私は興味がある、 "... – LearningToPython

0

「1つのライナーが」指名手配されている場合、あなたはmyListのうち、スライスi_をインライン化し、2つのランダムサンプルを取る、i_を追加して、「シャッフル」することができますsample(x, k=len(x))とそのインライン行で書かれた

を破ります
i_ = 'd' 

myList = ['a','b','c','d','e'] 

random.sample(random.sample(myList[:myList.index(i_)] + 
          myList[(myList.index(i_) + 1):], 
          2) 
       + [i_], k=3) 

['c', 'd', 'b'] 
関連する問題