Ruby 散列是否有一个与'Array::sample'等价的值?
我想从散列中提取n个随机键值对。我不知道这种方法。您仍然可以执行以下操作:Ruby 散列是否有一个与'Array::sample'等价的值?,ruby,hash,random,Ruby,Hash,Random,我想从散列中提取n个随机键值对。我不知道这种方法。您仍然可以执行以下操作: h[h.keys.sample] keys_sample = h.keys.sample(n) keys_sample.zip(keys_sample.map{|k| h[k]) 如果需要对多个元素进行采样,那么代码就必须稍微复杂一些 编辑:要获取键值对而不是仅获取值,可以执行以下操作: h[h.keys.sample] keys_sample = h.keys.sample(n) keys_sample.zip(
h[h.keys.sample]
keys_sample = h.keys.sample(n)
keys_sample.zip(keys_sample.map{|k| h[k])
如果需要对多个元素进行采样,那么代码就必须稍微复杂一些
编辑:要获取键值对而不是仅获取值,可以执行以下操作:
h[h.keys.sample]
keys_sample = h.keys.sample(n)
keys_sample.zip(keys_sample.map{|k| h[k])
对于Ruby 2.1
original_hash.to_a.sample(n).to_h
如果您的示例只有一个元素,则可以使用以下内容:
sample = h.keys.sample
h.select { |k,v| k == sample }
n = 2
sample = h.keys.sample(n)
h.select { |k,v| sample.include?(k) }
或者,如果您的示例包含多个元素,请使用以下选项:
sample = h.keys.sample
h.select { |k,v| k == sample }
n = 2
sample = h.keys.sample(n)
h.select { |k,v| sample.include?(k) }
实现这一目标的一种方法:
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]
阅读排名靠前的答案,我会选择它,这取决于:
数组#sample
:
hsh[hsh.keys.sample]
hsh.to_a.sample(n).to_h
Array#To_h
:
hsh[hsh.keys.sample]
hsh.to_a.sample(n).to_h
请注意,
hsh.to_.sample.to_h
将无法按预期工作。它将提高
TypeError: wrong element type String at 0 (expected array)
因为在本例中,Array#sample
只返回元素数组,而不返回包含元素数组的数组
解决方案是他的解决方案,提供一个n=1
作为参数:
hsh.to_a.sample(1).to_h
PS:不查找UPVOUTS,只添加它作为对Ruby新手的解释。这不会返回OP所需的键值对,只返回随机键的值。@theTinMan true。我明白了。事实上,sawa的解决方案是这个问题的最简洁的解决方案。如果您能展示一个输入哈希的示例,并解释一下您试图使用它的目的,这会有所帮助。从散列中获取随机键/值对很少有用,除非可能用于测试从已知集合中随机输入的内容。根据我的经验,这是一个非常奇怪的要求,让我觉得有些东西不可靠。我也有同样的需要。我有一个散列,它也可以存储为一个散列数组。能够从一个数组中随机获取n个条目是有意义的。如果h只有一个元素,那么使用
=h
。我说如果样本只有一个元素。我的示例假设一个散列包含多个键值对。用一个元素对散列进行采样是没有意义的……如果我从一个较大的散列中获取数据,这是一个慢主意还是一个坏主意?那么,还有其他方法可以尝试吗?@appleLover我想不出更好的方法了。我很好奇,所以我对它进行了基准测试。。。如果其他人对您的格式感到好奇,hsh[hsh.keys.sample].keys
也可能是解决方案,前提是您要在特定哈希键下查找子键。例如,users['johndoe']=user\u hash
不确定是否有更“ruby”的方法来实现这一点。