对于哈希,是否有等效的"Array :: sample"?

rya*_*ent 42 ruby random hash

我想从哈希中提取n个随机键值对.

saw*_*awa 50

Hash[original_hash.to_a.sample(n)]
Run Code Online (Sandbox Code Playgroud)

对于Ruby 2.1,

original_hash.to_a.sample(n).to_h
Run Code Online (Sandbox Code Playgroud)

  • 我很好奇所以我对它进行了基准测试......以防其他人好奇 https://gist.github.com/bendyorke/924612cba7432cbf36dd (2认同)

izo*_*ica 35

我不知道这种方法.你仍然可以这样做:

h[h.keys.sample]
Run Code Online (Sandbox Code Playgroud)

如果您需要对多个元素进行采样,则代码必须更复杂一些.

编辑:获取键值对而不是只能使用以下值的值:

keys_sample = h.keys.sample(n)
keys_sample.zip(keys_sample.map{|k| h[k])
Run Code Online (Sandbox Code Playgroud)


Mar*_*tuc 5

阅读排名靠前的答案,我会选择它取决于

  1. 如果您只想从哈希中采样一个元素,@Ivaylo Strandjev 的解决方案仅依赖于哈希查找和Array#sample

    hsh[hsh.keys.sample]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为了对多个哈希元素进行采样,@sawa 的回答利用了Array#to_h

    hsh.to_a.sample(n).to_h
    
    Run Code Online (Sandbox Code Playgroud)

请注意,正如@cadlac 所提到的hsh.to_a.sample.to_h不会按预期工作。它会提高

TypeError: wrong element type String at 0 (expected array)
Run Code Online (Sandbox Code Playgroud)

因为Array#sample在这种情况下只返回元素数组,而不是包含元素数组的数组。

解决方法是他的解决方案,提供一个n = 1作为参数:

hsh.to_a.sample(1).to_h
Run Code Online (Sandbox Code Playgroud)

PS:不是在寻找赞成票,只是将其添加为对 Ruby 新手的解释。