Рубиновая хеш-группа по значению

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

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

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

5
0
767
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

Это так полезно. Спасибо :)

Sambit 13.09.2018 18:44

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

student_marks.each.with_object(Hash.new([])){ |(k,v), h| h[v] += [k] }
#=> {50=>["Alex", "Matt"], 54=>["Beth"]}
student_marks.group_by(&:last).transform_values { |v| v.map(&:first) }
  #=> {50=>["Alex", "Matt"], 54=>["Beth"]}

Хэш # transform_values дебютировал в Ruby MRI v2.4.0.

Это сообщение об ошибке : undefined method transform_values' for {50=>[["Alex", 50], ["Matt", 50]], 54=>[["Beth", 54]]}:Hash (NoMethodError)

Rajagopalan 17.09.2018 15:12

@Rajagopalan, я только что внес правку, которая, как я ожидаю, объясняет, почему у вас возникла ошибка отсутствия метода. Всякий раз, когда код работает для одного человека (как это явно было для меня), но не работает для другого (вас), это неизменно проблема версии. Я использовал v2.5.1

Cary Swoveland 17.09.2018 15:54

Другой простой способ

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

На самом деле это гораздо более простой способ.

Sambit 27.07.2021 07:39

Другие вопросы по теме