4

これは、ランダムなシーケンスを生成する方法、つまり、それぞれに重みが関連付けられているときに色を選択する方法に関する Python ドキュメントの簡単なコードです。

概念は理解していますが、自分でやろうとしたときにリスト内包表記が何をしているのかわかりません。このリスト内包表記が何をしているのかを誰かが繰り返し説明してくれるので、このコードをよりよく理解できます。ありがとう。

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'
4

4 に答える 4

2
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']
于 2013-01-22T22:59:57.833 に答える
1

for次のようなループのように考えてください。

population = []
for val, cnt in weighted_choices:
  for i in range(cnt):
    population.append(val)

から始めてweighted_choices、各アイテムを反復処理し、次のようにします。

('Red', 3)

そこから、長さの範囲 (ここでは 3) を反復し、その回数に (Red) をcnt追加します。したがって、最後に次のようになります。valpopulation

['Red',
 'Red',
 'Red',
 'Blue',
 'Blue',
 'Yellow',
 'Green',
 'Green',
 'Green',
 'Green']

ご覧のとおり、これにはRed3 回、Blue2 回、Yellow1 回、Green4 回が含まれており、初期リストの各色の横にある数字を反映しています。

このように二重にネストされたリスト内包表記を見ると、for上記のようなループを考えて、頭の中でそれを「押しつぶして」、すべてが 1 行になるようにします。最も高度な方法ではありませんが、それは私がそれをまっすぐに保つのに役立ちます:)

于 2013-01-22T22:38:12.267 に答える
1

リスト内包表記を拡張して分析することをお勧めします。

population = []
for val, cnt in weighted_choices:
    for i in range(cnt):
        population.append(val)

これweighted_choicesは要素のリストに展開され、各アイテムは重みに従って繰り返されます。が 3 回、 2 回などRed追加されます。Blue

['Red', 'Red', 'Red', 'Blue', 'Blue', 'Yellow', 'Green', 'Green', 'Green', 'Green']

次に、random.choice()関数はこれらの要素の 1 つをランダムGreenに取得しますが、4 回発生するため、展開されたリストに 1 回だけ存在する などよりも、選択される可能性が高くなりYellowます。

于 2013-01-22T22:39:06.890 に答える
0

リスト内包表記は 2 つの for ループで構成されます。

print代わりに試してみてください

for val, cnt in weighted_choices:
  # the first for loop will be executed len(weighted_choices) times = 4
  for i in range(cnt):
  # the second for loop will be executed cnt times
  # for each execution of the outer loop 
  # (cnt = second element of each tuple)
      print val # it will print each first element of the tuple 'Red', ...
                # len(weighted_choices) * cnt times

コードの代わりに、 population というリストに をprint追加します。val残りは些細なことで、コードはリストを入力として使用してランダムな選択を行います。

于 2013-01-22T22:43:59.253 に答える