Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 散列是否有一个与'Array::sample'等价的值?_Ruby_Hash_Random - Fatal编程技术网

Ruby 散列是否有一个与'Array::sample'等价的值?

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(

我想从散列中提取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(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”的方法来实现这一点。