2012-03-10 34 views
19

Tôi đã xem xét các câu hỏi khác trong SO và không tìm thấy câu trả lời cho vấn đề cụ thể của mình.Tạo một băm từ một dãy các phím

Tôi có một mảng:

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

Tôi muốn chuyển đổi mảng này cho một người băm nơi các phần tử mảng trở thành chìa khóa trong băm và tất cả họ cùng giá trị nói 1. tức là băm nên là:

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

Trả lời

43

Giải pháp của tôi, một trong số những người khác :-)

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

đây:

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

này giả định rằng, mỗi ví dụ của bạn ở trên, rằng a=['a', 'b', 'c', 'd']theValue=1.

+1

Bạn không cần 'flatten', [' Hash [] '] (http://ruby-doc.org/core-1.9.3/Hash.html#method-c-5B-5D) có thể mất n Mảng mảng. –

+0

Cảm ơn. Tôi sẽ thay đổi nó. – Linuxios

+0

Hash [] dường như không lấy mảng mảng không may: 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) sẽ phù hợp hơn ở đây. –

+0

@muistooshort Nó chắc chắn sẽ là, nhưng nó không phải cái gì tôi đã sử dụng đủ cho nó để đến tâm trí khi tôi đang mã hóa. Cảm ơn! ':)' –

+0

Tôi sử dụng nó rất nhiều vì giá trị trả về thêm trong khối trông cô đơn :) –

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

Bạn có thể sử dụng product:

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

Hoặc bạn cũng có thể sử dụng phương pháp transpose:

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

wow ! điều này thật thanh lịch! – zx1986

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

4 tùy chọn, đạt được kết quả mong muốn:

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 

Tất cả các tùy chọn này dựa vào Array#to_h, có sẵn trong Ruby v2.1 hoặc cao hơn

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

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

Bạn có thể định dạng mã bằng cách chọn nó và sau đó nhấn CTRL + K –

0
{}.tap{|h| %w(a b c d).each{|x| h[x] = 1}} 
Các vấn đề liên quan