代码之家  ›  专栏  ›  技术社区  ›  Sambit

Ruby哈希按值分组

  •  3
  • Sambit  · 技术社区  · 6 年前

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

    我正在寻找一个解决方案,根据学生的分数分组。

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

    我试过了 group_by .

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

    提前谢谢。

    3 回复  |  直到 6 年前
        1
  •  5
  •   spickermann    6 年前

    我会这样做:

    student_marks.group_by { |k, v| v }.map { |k, v| [k, v.map(&:first)] }.to_h
    #=> { 50 => ["Alex", "Matt"], 54 => ["Beth"]}
    
        2
  •  4
  •   Cary Swoveland    6 年前
    student_marks.group_by(&:last).transform_values { |v| v.map(&:first) }
      #=> {50=>["Alex", "Matt"], 54=>["Beth"]}
    

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

        3
  •  3
  •   fl00r    6 年前

    student_marks.each.with_object(Hash.new([])){ |(k,v), h| h[v] += [k] }
    #=> {50=>["Alex", "Matt"], 54=>["Beth"]}
    
        4
  •  0
  •   Neel Tandel    4 年前

    另一个简单的方法

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