Ruby哈希按值分组

时间:2018-09-13 16:33:02

标签: ruby

我有一个包含学生姓名和标记的红宝石哈希,如下所示。

student_marks = {
    "Alex" => 50,
    "Beth" => 54,
    "Matt" => 50
}

我正在寻找一种根据学生的成绩对他们进行分组的解决方案。

{
    50 => ["Alex", "Matt"],
    54 => ["Beth"]
}

我尝试了group_by,但没有得到期望的结果。以下是使用group_by的结果。

student_marks.group_by {|k,v| v}
{50=>[["Alex", 50], ["Matt", 50]], 54=>[["Beth", 54]]}

谢谢。

4 个答案:

答案 0 :(得分:4)

我会做这样的事情:

student_marks.group_by { |k, v| v }.map { |k, v| [k, v.map(&:first)] }.to_h
#=> { 50 => ["Alex", "Matt"], 54 => ["Beth"]}

答案 1 :(得分:4)

student_marks.group_by(&:last).transform_values { |v| v.map(&:first) }
  #=> {50=>["Alex", "Matt"], 54=>["Beth"]}

Hash#transform_values在Ruby MRI v2.4.0中首次亮相。

答案 2 :(得分:3)

另一种方式可能是

student_marks.each.with_object(Hash.new([])){ |(k,v), h| h[v] += [k] }
#=> {50=>["Alex", "Matt"], 54=>["Beth"]}

答案 3 :(得分:0)

另一种简便方法

student_marks.keys.group_by{ |v| student_marks[v] }
{50=>["Alex", "Matt"], 54=>["Beth"]}