2012-03-10 13 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

あなたを'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

:-)他の人の中の1つのあなたは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

wow !これはとてもエレガントです! – zx1986

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

4つの、より多くのオプション、所望の出力達成:RubyのV2.1で利用可能な

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に依存している、またはそれ以上

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}} 
関連する問題