

配列の`[0]`には人名を、配列の`[1]`にはスコアが入っている二次元配列をまとめる方法を教えてください。

* * *
[code]

    score = [["taro",10],["taro", 70], ["taro", 170], ["jiro", 90], ["jiro", 55]]
    
[/code]

求める出力

[code]

    taro => 250
    jiro => 145
    
[/code]


CC BY-SA 4.0
2018-09-19T06:29:04.983
48538
2018-11-09T16:30:14.363
2018-09-19T06:38:24.943
3060
30169
question
ruby
Ruby 二次元配列のまとめ方について教えてください。

[code]

    score.group_by { |name, _| name }
         .map do |name, entries|
           [name, entries.map { |_, value| value }.sum]
         end.to_h
    
[/code]

Enumerable クラスの、 `group_by`, `sum`, `map`, `to_h` を利用すると実現できます。

<https://docs.ruby-lang.org/ja/latest/class/Enumerable.html>


CC BY-SA 4.0
2018-09-19T07:00:26.683
48541
2018-09-19T07:00:26.683
754
48538
answer


配列を舐めて各キーごとにハッシュに突っ込む感じで作ってみました。

[code]

    score_map = Hash.new()
    score.each{|pair|
        score_map.has_key?(pair[0])?score_map[pair[0]]+=pair[1]:score_map[pair[0]]=pair[1]
    }
    
    # => {"taro"=>250, "jiro"=>145}
    
[/code]

もっとスマートなやり方があるかもしれません。


CC BY-SA 4.0
2018-09-19T07:00:52.393
48542
2018-09-19T07:00:52.393
29826
48538
answer

[code]

    score = [["taro", 10], ["taro", 70], ["taro", 170], ["jiro", 90], ["jiro", 55]]
    result = score.group_by do |s|
      s[0]
    end.map do |k, v|
      { k => v.sum{ |num| num[1] } }
    end
    puts result
    
    #=> [{"taro"=>250}, {"jiro"=>145}]
    
[/code]

こんなのとか？


CC BY-SA 4.0
2018-09-19T07:06:44.533
48543
2018-09-19T07:26:02.817
2018-09-19T07:26:02.817
2383
2383
48538
answer


こういうのって、大喜利かコードゴルフ大会になるからあまり多くのパターンを出し過ぎるのもよくないんですが、私好みのコードの例がなかったので、参戦します。

[code]

    score.group_by(&:first).transform_values { |a| a.sum(&:last) }
    
[/code]

[`Hash#transform_value`](https://docs.ruby-
lang.org/ja/latest/method/Hash/i/transform_values.html)と[`Array#sum`](https://docs.ruby-
lang.org/ja/latest/method/Array/i/sum.html)は2.4.0からですので注意してください。`&:first`と言う表現は`:first`が`to_proc`で`Proc`になってブロックとして渡されるというものです。ブロックだらけになるのをある程度は防いでくれます。


CC BY-SA 4.0
2018-09-19T10:42:14.040
48554
2018-09-19T10:42:14.040
7347
48538
answer

[code]

    score = [["taro",10],["taro", 70], ["taro", 170], ["jiro", 90], ["jiro", 55]]
    
    hash = {}
    score.each do |a|
      if hash[a[0]]
        hash[a[0]] = hash[a[0]] + a[1]
      else
        hash[a[0]] = a[1]
      end
    end
    
    pp hash
    
[/code]


CC BY-SA 4.0
2018-11-09T16:30:14.363
50139
2018-11-09T16:30:14.363
30913
48538
answer