是否有一个相当于'阵:: sample`的哈希?(Is there an equivalen

2019-07-21 19:32发布

我期待从散列提取n个随机键值对。

Answer 1:

Hash[original_hash.to_a.sample(n)]

为Ruby 2.1,

original_hash.to_a.sample(n).to_h


Answer 2:

我不知道这样的方法。 不过,你可以这样做:

h[h.keys.sample]

如果你需要一个以上的元件样品代码将不得不更复杂一些。

编辑:获取键值对,而不是只有你可以做这样的事情的价值:

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


Answer 3:

如果您的样品只有一个元素,你可以这样做:

sample = h.keys.sample
h.select { |k,v| k == sample }

或者,如果你的样品包含多个元素,使用:

n = 2
sample = h.keys.sample(n)
h.select { |k,v| sample.include?(k) }


Answer 4:

读排名靠前的答案,我会用这取决于去:

  1. 如果你想品尝来自哈希只有一个元素, @Ivaylo Strandjev的解决方案只能依赖于哈希查找和Array#sample

     hsh[hsh.keys.sample] 
  2. 采样多个哈希元素, @泽的回答充分利用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:不找upvotes,只是将其添加为新人们到Ruby解释。



Answer 5:

一种方法来实现:

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]


文章来源: Is there an equivalent to `Array::sample` for hashes?
标签: ruby hash random