输入:
a = [[:a, "apple"], [:b, "bear"]]
输出:
{:a=>"apple", :b=>"bear"}
我认为可以这样做:
h = a.inject({}){|dic,i| dic.merge({i[0]=>i[1]})}
但我仍然认为这不是最好的方法。是否有更好的解决方案?
输入:
a = [[:a, "apple"], [:b, "bear"]]
输出:
{:a=>"apple", :b=>"bear"}
h = a.inject({}){|dic,i| dic.merge({i[0]=>i[1]})}
>> Hash[*a.flatten]
=> {:a=>"apple", :b=>"bear"}
或者一个更漂亮的:
>> Hash[a]
或者在2.1之后:
>> a.to_h
Hash[a]
在 Ruby 1.8.7 中也可以使用。因此,我们基本上可以清除丑陋的 hack *+flatten。 - toklandHash[[["a", 100], ["b", 200]]].each
将在1.8中首先处理"b"=>200
。 - halfelfHash[]
的问题在于它不像一流的 to_h
或 to_hash
方法那样接受额外的参数。 - tadman
merge
为列表中的每个键值对创建另外一个哈希。由于所创建的中间哈希数量将是您的列表长度的两倍,因此这种方法效率极低。 这个高效的inject
版本应该是:h = a.inject({ }) { |h, (k, v)| h[k] = v; h }
- tadman