ハッシュからn個のランダムなキーと値のペアを抽出しようとしています。
5 に答える
Hash[original_hash.to_a.sample(n)]
Ruby 2.1 の場合、
original_hash.to_a.sample(n).to_h
私はそのような方法を知りません。それでも、次のようなことができます。
h[h.keys.sample]
複数の要素をサンプリングする必要がある場合、コードはもう少し複雑にする必要があります。
編集:値だけでなくキーと値のペアを取得するには、次のように実行できます。
keys_sample = h.keys.sample(n)
keys_sample.zip(keys_sample.map{|k| h[k])
トップランクの回答を読んで、私はそれに依存します:
ハッシュから 1 つの要素のみをサンプリングする場合、 @Ivaylo Strandjev のソリューションは、ハッシュ ルックアップと
Array#sample
:hsh[hsh.keys.sample]
複数のハッシュ要素をサンプリングするために、 @sawa の回答では以下を活用してい
Array#to_h
ます。hsh.to_a.sample(n).to_h
@cadlac が言及しているように、期待どおりに動作しないことに注意してくださいhsh.to_a.sample.to_h
。上げてくれる
TypeError: wrong element type String at 0 (expected array)
Array#sample
この場合、要素配列を含む配列ではなく、要素配列のみを返すためです。
回避策は彼の解決策でありn = 1
、引数として を提供します。
hsh.to_a.sample(1).to_h
PS: 賛成票を探すのではなく、Ruby を初めて使用する人への説明として追加するだけです。
サンプルに要素が 1 つしかない場合は、次のように使用できます。
sample = h.keys.sample
h.select { |k,v| k == sample }
または、サンプルに複数の要素が含まれている場合は、次を使用します。
n = 2
sample = h.keys.sample(n)
h.select { |k,v| sample.include?(k) }
これを実現する 1 つの方法:
rank_hash = {"Listen" => 1, "Download" => 60, "Share" => 150, "Purchase" => 700 }
rank_array = rank_hash.to_a
これを呼び出して、k/v ペアのランダム配列サンプルを取得します。
rank_array[rand(0..3)]
または、配列の長さをハードコーディングしないようにするには、次のようにします。
rank_array[rand(0..(rank_array.length) -1)]
例:
["Download", 60]