2009-04-11 3 views
16

У меня есть два массива, как это:Преобразование массива ключей и массив значений в хэш в 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 

ответ

50

следующие работы в 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

Так что Hash [keys.zip (values)] then? –

+0

Спасибо, метод zip, вероятно, то, что мне нужно ... но часть «Hash [zipped]» дает мне ошибку в Ruby 1.8.6: «ArgumentError: нечетное количество аргументов для Hash». И я просто не могу понять еще один простой способ изменения «застрял» в хэш ... –

+0

Хм. Я использую 1.8.7. Похоже, что это могло быть введено в 1.8.7. Я отредактирую ответ для обратной совместимой версии. –

8

Другой способ заключается в использовании each_with_index:

hash = {} 
keys.each_with_index { |key, index| hash[key] = values[index] } 

hash # => {"a"=>1, "b"=>2, "c"=>3} 
5

То же самое можно сделать с помощью метода 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} 
0

Попробуйте это, таким образом, последний один 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> 
Смежные вопросы