46

ハッシュからn個のランダムなキーと値のペアを抽出しようとしています。

4

5 に答える 5

51
Hash[original_hash.to_a.sample(n)]

Ruby 2.1 の場合、

original_hash.to_a.sample(n).to_h
于 2013-03-16T21:13:30.820 に答える
41

私はそのような方法を知りません。それでも、次のようなことができます。

h[h.keys.sample]

複数の要素をサンプリングする必要がある場合、コードはもう少し複雑にする必要があります。

編集:値だけでなくキーと値のペアを取得するには、次のように実行できます。

keys_sample = h.keys.sample(n)
keys_sample.zip(keys_sample.map{|k| h[k])
于 2013-03-16T20:57:38.663 に答える
6

トップランクの回答を読んで、私はそれに依存します

  1. ハッシュから 1 つの要素のみをサンプリングする場合、 @Ivaylo Strandjev のソリューションは、ハッシュ ルックアップとArray#sample:

    hsh[hsh.keys.sample]
    
  2. 複数のハッシュ要素をサンプリングするために、 @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 を初めて使用する人への説明として追加するだけです。

于 2015-11-26T17:04:02.333 に答える
2

サンプルに要素が 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) }
于 2013-03-16T22:39:21.023 に答える
0

これを実現する 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]
于 2015-05-28T20:30:02.247 に答える