Добавить значение к существующей хэш-ссылке ruby ​​пары ключ-значение

Мой скрипт ruby ​​фильтрует логи и генерирует хеш

scores = {"Rahul" => "273", "John"=> "202", "coventry" => "194"}

пропуская несколько значений для ключа, который очевиден

файл журнала будет таким

Рахул имеет 273 Рахул имеет 217 Джон имеет 202 Ковентри имеет 194

Можно ли сгенерировать что-то подобное

scores = {"Rahul" => "273", "Rahul" =>"217",
          "John"=> "202", "coventry" => "194"}

scores = {"Rahul" => "273","217",
          "John"=> "202", "coventry" => "194"}

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

Буду благодарен любой помощи или предложениям

2 ответа

Решение

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

scores = Hash.new { |hash, key| hash[key] = [] }

scores['Rahul'] #=> [] <- a fresh and empty array

Теперь вы можете извлечь значения из журнала и добавить его к значению соответствующего ключа. я использую scanс блоком: (используя образец из ответа мудасобвы)

log = 'Rahul has 273 Rahul has 217 John has 202 Coventry has 194'

log.scan(/(\w+) has (\d+)/) { |name, score| scores[name] << score.to_i }

scores #=> {"Rahul"=>[273, 217], "John"=>[202], "Coventry"=>[194]}

Хотя это и не обязательно, я преобразовал каждый счет в целое число, прежде чем добавить его в массив.

"Rahul has 273 Rahul has 217 John has 202 Coventry has 194".
  scan(/(\w+) has (\d+)/).group_by(&:shift)
#⇒ {"Rahul"=>[["273"], ["217"]],
#   "John"=>[["202"]],
#   "Coventry"=>[["194"]]}

Для выравнивания значений, пожалуйста, проверьте комментарий Johan Wentholt ниже.

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