我期待从散列提取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:
读排名靠前的答案,我会用这取决于去:
如果你想品尝来自哈希只有一个元素, @Ivaylo Strandjev的解决方案只能依赖于哈希查找和
Array#sample
:hsh[hsh.keys.sample]
采样多个哈希元素, @泽的回答充分利用
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?