Рубиновая хеш-группа по значению - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть рубиновый хеш, содержащий имя ученика и пометку следующим образом.

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]]}

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Другой способ может быть

student_marks.each.with_object(Hash.new([])){ |(k,v), h| h[v] += [k] }
#=> {50=>["Alex", "Matt"], 54=>["Beth"]}
0 голосов
/ 14 сентября 2018
student_marks.group_by(&:last).transform_values { |v| v.map(&:first) }
  #=> {50=>["Alex", "Matt"], 54=>["Beth"]}

Hash # transform_values ​​ дебютировал в Ruby MRI v2.4.0.

0 голосов
/ 13 сентября 2018

Я бы сделал что-то вроде этого:

student_marks.group_by { |k, v| v }.map { |k, v| [k, v.map(&:first)] }.to_h
#=> { 50 => ["Alex", "Matt"], 54 => ["Beth"]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...