Мой скрипт 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"}

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

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

0
Hameed Basha 14 Мар 2018 в 12:14

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

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

1
Stefan 14 Мар 2018 в 11:40
"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"]]}

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

4
Aleksei Matiushkin 14 Мар 2018 в 10:16