2012-03-10 3 views
19

Я рассмотрел другие вопросы в SO и не нашел ответа для моей конкретной проблемы.Создать хэш из массива ключей

У меня есть массив:

a = ["a", "b", "c", "d"] 

Я хочу, чтобы преобразовать этот массив в хэш, где элементы массива становятся ключами в хэш, и все они одинаковые значения говорят 1. т.е. хэш должен быть:

{"a" => 1, "b" => 1, "c" => 1, "d" => 1} 

ответ

43

Мое решение, один среди остальных :-)

a = ["a", "b", "c", "d"] 
h = Hash[a.map {|x| [x, 1]}] 
2

Здесь:

theHash=Hash[a.map {|k| [k, theValue]}] 

Это предполагает, что в вашем примере выше, что a=['a', 'b', 'c', 'd'] и что theValue=1.

+1

You не нужно 'flatten', [' Hash [] '] (http://ruby-doc.org/core-1.9.3/Hash.html#method-c-5B-5D) может принимать n Массив массивов. –

+0

Спасибо. Я изменю его. – Linuxios

+0

Хэш [], к сожалению, не принимает массив массивов: Hash [[1, 2], [3, 4]] => {[1, 2] => [3, 4]} –

2
["a", "b", "c", "d"].inject({}) do |hash, elem| 
    hash[elem] = 1 
    hash 
end 
+2

['each_with_object'] (http://www.ruby-doc.org/core-1.9.3 /Enumerable.html#method-i-each_with_object) будет лучше подходит здесь. –

+0

@muistooshort Это определенно было бы, но это не то, что я использовал достаточно, чтобы это пришло мне в голову, когда я кодирую. Благодаря! ':)' –

+0

Я использую это много, как дополнительное возвращаемое значение в блоке выглядит одиноко :) –

3
a = %w{ a b c d e } 

Hash[a.zip([1] * a.size)] #=> {"a"=>1, "b"=>1, "c"=>1, "d"=>1, "e"=>1} 
0
a = ["a", "b", "c", "d"] 
h = a.inject({}){|h,k| h[k] = 1; h} 
#=> {"a"=>1, "b"=>1, "c"=>1, "d"=>1} 
13

Вы можете использовать product:

a.product([1]).to_h 
#=> {"a"=>1, "b"=>1, "c"=>1, "d"=>1} 

Или вы можете также использовать transpose метод:

[a,[1] * a.size].transpose.to_h 
#=> {"a"=>1, "b"=>1, "c"=>1, "d"=>1} 
+0

вау ! это так элегантно! – zx1986

4
a = ["a", "b", "c", "d"] 

еще 4 варианта, достижение желаемых результатов:

h = a.map{|e|[e,1]}.to_h 
h = a.zip([1]*a.size).to_h 
h = a.product([1]).to_h 
h = a.zip(Array.new(a.size, 1)).to_h 

Все эти варианты полагаются на Array#to_h, доступные в Ruby, v2.1 или выше

0
a = ['1','2','33','20'] 

Hash[a.flatten.map{|v| [v,0]}.reverse] 
+0

Вы можете форматировать код, выбрав его, а затем нажав CTRL + K –

0
{}.tap{|h| %w(a b c d).each{|x| h[x] = 1}} 
Смежные вопросы