2次元配列の特定の値をキーにしたHashを生成する方法


コード自体はかけたのですが、もう少し上手くかけないかと思い質問致します。

[code]

    ﻿﻿a = [[2014, 3], [2014, 5], [2015, 4], [2016, 2], [2016, 8]]
    
[/code]

という配列から、配列の初めの要素に入っている年号をキーにした

[code]

    {2014 => [3, 5],
     2015 => [4],
     2016 => [2, 8]}
    
[/code]

という`Hash`を生成したく

[code]

    a.group_by(&:first).map{|k, v| [k, v.map(&:last)]}.to_h
    
[/code]

と書いたのですがかなりわかりにくい気がするので

[code]

    h = {}
    a.each do |k, v|
      h[k] ||= [] 
      h[k] << v
    end
    h
    
[/code]

としました。できればもう少しすっきり書きたいのですがもっとシンプルな書き方はありますか？




私もいつも悩みます。  
その中でもやっているのは、デフォルト値を使うことで、key の判定を省略する方法です。

[code]

    h = Hash.new { |h, k| h[k] = [] }
    a.each do |k, v|
      h[k] << v
    end
    h
    
[/code]

またこちらの記事 <http://qiita.com/cuzic/items/a265f140fdff289d5c07#objecttap>
を読んでから、tap を使うことも多いです。

[code]

    years_month_lists = {}.tap do |h|
      a.each do |k, v|
        h[k] ||= []
        h[k] << v
      end  
    end
    
[/code]




`inject` を使うのはどうでしょうか。

[code]

    a.inject(Hash.new([])){|h, (k, v)| h[k] += [v]; h}
    
[/code]

