Добавить значение к существующей хэш-ссылке 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 ниже.