web-dev-qa-db-ja.com

ハッシュの `Array :: sample`に相当するものはありますか?

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

43
ryanVincent
Hash[original_hash.to_a.sample(n)]

Ruby 2.1の場合、

original_hash.to_a.sample(n).to_h
51
sawa

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

h[h.keys.sample]

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

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

keys_sample = h.keys.sample(n)
keys_sample.Zip(keys_sample.map{|k| h[k])
35

トップランクの回答を読んで、私はそれで決まります

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

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

4
Marius Butuc

サンプルに要素が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) }
2
fbonetti

これを達成する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]
0
Ryan Rebo