高木のブログ

【Ruby】2.7から追加されたEnumerable#tallyメソッドが便利

2021/08/07

Ruby 2.7から追加されたEnumerable#tallyメソッドが便利なので、必要になったときにすぐ使えるようにメモしておく

Enumerable#tally

tallyメソッドは配列内の同じ要素の数を数えてHashで返してくれるメソッド

[1,2,2,2,3,3,4,5].tally
#=> {1=>1, 2=>3, 3=>2, 4=>1, 5=>1}

今までやり方

2.7以前では以下のようなやり方でやるしかなかった

[1,2,2,2,3,3,4,5].group_by(&:itself).transform_values(&:size)
#=> {1=>1, 2=>3, 3=>2, 4=>1, 5=>1}

他にもやり方は存在するが、どれも1メソッドで完結できない

Enumerable#tally_by

tally_byは残念ながら存在しない

存在したら単語の頭文字で集計などに使える

['Apple', 'Box', 'Cat', 'Ball', 'Cup'].tally_by { |s| s[0] }
#=> {"A"=>1, "B"=>2, "C"=>2}

代替

map経由なら実現できる

['Apple', 'Box', 'Cat', 'Ball', 'Cup'].map { |s| s[0] }.tally
#=> {"A"=>1, "B"=>2, "C"=>2}

一応、採用するかどうかは議論中みたい
https://bugs.ruby-lang.org/issues/11076#note-22

参考


Written by ytkg, Twitter, GitHub

Pixela