我正在寻找从哈希中提取 n 个随机键值对。
问问题
19478 次
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
阅读排名靠前的答案,我会选择它取决于:
如果您只想从哈希中采样一个元素,@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 新手的解释。
于 2015-11-26T17:04:02.333 回答
2
如果你的样本只有一个元素,你可以使用这个:
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
实现此目的的一种方法:
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 回答