如何使用Hash中的键创建一个新的Hash,其中每个键的值都是键本身?

时间:2010-12-10 17:46:07

标签: ruby hash

所以这是一个微不足道的,但希望有趣的问题。我需要使用现有Hash的键创建具有相同键和值的Hash。这是一个示例输入以及我迄今为止的最佳尝试:

input = {'cat' => 'meow', 'dog' => nil}
Hash[*input.keys.map {|k| [k,k]}.flatten]
#=> {'cat' => 'cat', 'dog' => 'dog'}

我认为这不是特别易读,所以我想知道在Ruby中是否有更好的,更具表现力的语法,尤其是对于维护代码的未来程序员来说可能更具可读性的语法?

这就是我在Python中做同样的事情,我觉得它更具可读性:

dict([[a,a] for a in input])

但那可能只是因为我习惯于阅读Python!

寻找适用于Ruby 1.8.6的建议,这是我受限制的版本。

2 个答案:

答案 0 :(得分:3)

h = {'cat' => 'meow', 'dog' => nil}
#=> {"cat"=>"meow", "dog"=>nil}
Hash[h.keys.map{|k| [k,k]}]
#=> {"cat"=>"cat", "dog"=>"dog"}

这是另一种,有点脏的方式(我认为它适用于1.8.6):

h.merge(h){|k,v,v| k}

答案 1 :(得分:2)

Hash[input.keys.zip(input.keys)] #=> {"cat"=>"cat", "dog"=>"dog"}

或者使用注入:

input.keys.inject({}) { |h, k| h[k] = k ; h } #=> {"cat"=>"cat", "dog"=>"dog"}

第二个也适用于1.8.6。