我正在尝试从一个哈希到另一个哈希随机取几个键值对。从h取n个值并将其放入i
h = {"a"=>1,"b"=>2,"c"=>3}
n = 2
i = {}
答案 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}