如何仅在某些键中找到具有最小值的哈希中的键和值?

How do I find the keys and the value in a hash with the minimum value, only among certain keys?

使用Ruby 2.4。我有一个散列,其中的键和值都是数字(整数)。给定一组键,我如何找到具有最低值的条目(键和值)?如果我想找到我能做的最小值

my_hash.select{|k, v| my_selected_keys.include?(k) }.values.min_by(&:last)

但这只会让我得到值,而不是键和值。另请注意,我的哈希值不一定是唯一的。

您可以按值对哈希进行排序,然后取第一个元素

my_hash.select{|k, _| my_selected_keys.include?(k) }.sort_by{|_, v| v}.first

这是一个替代解决方案

hash.reduce([nil, Float::INFINITY]) { |acc, pair| acc[1] < pair[1] ? acc : pair }

您可以映射选定的键sel_keys:

hash = {1 => 2, 3 => 1, 4 => 5, 5 => 1} 
sel_keys = [3, 4] 
sel_keys.map { |k| [k,hash[k]] }.min_by(&:last) #=> [3, 1]

警告:这 returns 仅找到具有最小值的第一个键。

这是您要找的吗?

它获取所有具有最小值的键。为了清楚起见,我已经拆分并命名了许多中间对象:

hash = { 4 => 5, 2 => 9, 3 => 1, 8 => 5 }
selected = Set[2, 4, 8]

hash_subset = hash.slice(*selected)
keys_by_value = hash_subset.group_by(&:last).each_value { |group| group.map!(&:first) }

min_value, keys_with_min_val = keys_by_value.min_by(&:first)
# => [5, [4, 8]]

和强制性的 ruby oneliner:

hash.slice(*selected).group_by(&:pop).each_value(&:flatten!).min_by(&:first)