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. 如果您只想从哈希中采样一个元素,@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

如果你的样本只有一个元素,你可以使用这个:

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 回答