Преобразование массива ключей и массива значений в хэш в Ruby
У меня есть два массива:
keys = ['a', 'b', 'c']
values = [1, 2, 3]
Есть ли простой способ в Ruby преобразовать эти массивы в следующий хэш?
{ 'a' => 1, 'b' => 2, 'c' => 3 }
Вот мой способ сделать это, но я чувствую, что для этого должен быть встроенный метод.
def arrays2hash(keys, values)
hash = {}
0.upto(keys.length - 1) do |i|
hash[keys[i]] = values[i]
end
hash
end
Ответы
Ответ 1
В 1.8.7 показано следующее:
keys = ["a", "b", "c"]
values = [1, 2, 3]
zipped = keys.zip(values)
=> [["a", 1], ["b", 2], ["c", 3]]
Hash[zipped]
=> {"a"=>1, "b"=>2, "c"=>3}
Похоже, что это не работает в старых версиях Ruby (1.8.6). Следующее должно быть обратно совместимо:
Hash[*keys.zip(values).flatten]
Ответ 2
Другой способ - использовать each_with_index:
hash = {}
keys.each_with_index { |key, index| hash[key] = values[index] }
hash # => {"a"=>1, "b"=>2, "c"=>3}
Ответ 3
То же самое можно сделать с помощью метода Array#transpose
. Если вы используете версию Ruby >= 2.1, вы можете воспользоваться преимуществом метода Array#to_h
, в противном случае использовать ваш старый друг, Hash::[]
keys = ['a', 'b', 'c']
values = [1, 2, 3]
[keys, values].transpose.to_h
# => {"a"=>1, "b"=>2, "c"=>3}
Hash[[keys, values].transpose]
# => {"a"=>1, "b"=>2, "c"=>3}
Ответ 4
Смотрите SO Q & A: Что такое Ruby-эквивалент для Pythons? zip? builtin?
Ответ 5
Попробуйте, таким образом, последний d
перезапишет первый c
irb(main):001:0> hash = Hash[[[1,2,3,3], ['a','b','c','d']].transpose]
=> {1=>"a", 2=>"b", 3=>"d"}
irb(main):002:0>