如何仅在某些键中找到具有最小值的哈希中的键和值?
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)
使用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)