weighted_choices = [('Red', 3), ('Blue', 2), ('Yellow', 1), ('Green', 4)]
population = [val for val, cnt in weighted_choices for i in range(cnt)]
random.choice(population)
'Green'
理解を簡単に始めましょう
simple = [val for val, cnt in weighted_choices]
この単純なリスト内包表記はこれを行っています:
- weighted_choices のすべての項目について、最初の部分を分割して val に割り当て、2 番目の部分を cnt に割り当てます。
- val を取得し、各 val から新しい配列を作成します
これにより、次が生成されます。
['Red','Blue','Yellow''Green']
次に、2 番目の部分を見てみましょう。まず、単純なリスト内包表記を作成します。
second_part = ['Red' for i in range(3)]
リスト内包表記のこの 2 番目の部分は、次のことを行っています。
- 範囲内のすべての i (3) (数値 [0,1,2])
- i を破棄して 'Red' をリストに追加
これにより、次が生成されます。
['Red','Red','Red']
両方の理解を組み合わせる:
population = [val for val, cnt in weighted_choices for i in range(cnt)]
この単純なリスト内包表記はこれを行っています:
- weighted_choices のすべての項目について、最初の部分を分割して val に割り当て、2 番目の部分を cnt に割り当てます。(例: 「赤」と最初の項目の 3)
- 値を取り、
- range(cnt) (cnt が 3 の場合は数値 [0,1,2]) 内のすべての i について、i を破棄し、リストに val を追加します。
これにより、次が生成されます。
['Red', 'Red', 'Red', 'Blue', 'Blue', 'Yellow', 'Green', 'Green', 'Green', 'Green']