采用随机数量的哈希对并将其放入另一个红宝石中

时间:2018-01-26 02:34:28

标签: ruby

我正在尝试从一个哈希到另一个哈希随机取几个键值对。从h取n个值并将其放入i

h = {"a"=>1,"b"=>2,"c"=>3}
n = 2
i = {}

4 个答案:

答案 0 :(得分:1)

如果您使用的是Ruby 2.5+,请利用全新的Hash#slice方法,该方法旨在实现以下目标:

>> h = {"a"=>1,"b"=>2,"c"=>3}
>> n = 2

>> h.slice(*h.keys.sample(n))
#> {"c"=>3, "a"=>1}

答案 1 :(得分:0)

您可以使用keys.sample获取一组随机密钥,然后对其进行迭代,将h中的密钥和值添加到i

h = {"a"=>1,"b"=>2,"c"=>3}
n = 2
i = {}

h.keys.sample(n).each { |k| i[k] = h[k] }
i #=> {"b"=>2, "c"=>3}

或者您可以使用h中的值映射示例键,然后转换为哈希值。

h.keys.sample(n).map { |k| [k, h[k]] }.to_h
 #=> {"b"=>2, "a"=>1}

答案 2 :(得分:0)

h = {"a"=>1,"b"=>2,"c"=>3}
n = 2
random_keys = h.keys.sample(n)
i = random_keys.each_with_object({}){|m,o| o[m] = h[m]}
p i

结果:

{"b"=>2, "c"=>3}

示例方法将n个随机密钥作为数组。 each_with_objece使用新的哈希值迭代random_keys的元素。

答案 3 :(得分:0)

h = {"a"=>1,"b"=>2,"c"=>3}
n = 2
g = {pet: 'dog'}

rnd_keys = h.keys.sample(n)
  #=> ["c", "a"|
g.merge(h.select { |k,_| rnd_keys.include?(k) })
  #=> {:pet=>"dog", "a"=>1, "c"=>3}

如果在示例中,g为空,则只需:

h.select { |k,_| rnd_keys.include?(k) }
  # => {"a"=>1, "c"=>3}