今回はPythonの標準モジュールの一つであるcollections.Counterについて、解説していきたいと思います。
collections.Counterを使うと、Pythonで要素を数え上げるときにfor文を回すよりも綺麗なコードを書くことが出来ます。
この記事では、
・Counterとは
・辞書型の要素の数え上げ方法
・文字列の要素の数え上げ方法
・文字列の要素の数え上げ方法
といった基本的な内容から
・most_common()メソッドについて
など、一歩進んだ内容についても解説していきます。
※ この記事のコードはPython 3.7, Ubuntu 18.04で動作確認しました。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
Counterとは
Counterは、dictionary(辞書)やlist(リスト)などの複数の要素をもつコンテナ型と呼ばれる型の数え上げに使うことが出来るモジュールです。
collections — コンテナデータ型:https://docs.python.jp/3/library/collections.html
collectionsの中のメソッドとして機能するのでインポートするときには、
from collections import Counter
のように書きます。
それでは次項よりCounterの使いかたをパターン別に見ていきましょう。
Counterの基本的な使い方
まずはCounterの基本的なな使い方について解説します。
こちらのサンプルコードをご覧ください。
from collections import Counter mylist = ["apple","banana","apple","apple","orange"] mycounter = Counter(mylist) print(mycounter)
実行結果
Counter({'apple': 3, 'orange': 1, 'banana': 1})
このサンプルコードではCounterを使用する為に、まずモジュールをインポートしています。
Counterオブジェクトを作成するには、対象とするコンテナ型をCounter()の引数に渡します。
今回のサンプルコードでは、mylistというリスト型オブジェクトを引数に設定しました。
Counterの戻り値は、引数に設定したコンテナ型の要素とその数を格納した辞書形に似た形で返ってきます。
正確には辞書型のサブクラスが返ってきているので、辞書型と同じ機能を扱うことが出来ます。
実行結果を見てみると、appleがkeyでvalue(値)が3、orangeとbananaのkeyの値がそれぞれ1と表示されていますね。
辞書型の要素を数える
Counterとは何かを学んだところで、実際にコードを書いてみましょう。
Counterを使うと辞書型の要素を数えることが出来ます。
こちらのサンプルコードを見てみましょう。
mydict = {"apple" : 1, "banana" : 4, "orange" : 3} mycounter = Counter(mydict) print(mycounter)
実行結果
Counter({'banana': 4, 'orange': 3, 'apple': 1})
このサンプルコードでは、Counter()の引数としてmydictという辞書型オブジェクトを渡します。
実行結果には出現回数の順番に並び替えられた辞書型に似たオブジェクトが返ってきます。
文字列の要素を数える
Counterを使うと文字列の文字の出現回数を数えることが出来ます。
こちらのサンプルコードを見てみましょう。
myword = "helloworld!" mycounter = Counter(myword) print(mycounter)
実行結果
Counter({'l': 3, 'o': 2, '!': 1, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1})
このサンプルコードでは、文字列「helloworld!」に含まれている文字の出現回数を数えてみました。
Counterの引数としてmywordを指定すると、文字とその出現回数を格納した辞書型に似たオブジェクトが返ってきます。
また、文字の数え上げだけではなく単語も数え上げることも出来ます。
こちらのサンプルコードをご覧ください。
phrase = "my motto is one for all all for one" words = phrase.split() mycounter = Counter(words) print(mycounter)
実行結果
Counter({'all': 2, 'for': 2, 'one': 2, 'is': 1, 'motto': 1, 'my': 1})
こちらのサンプルコードでは文字列型のオブジェクトであるphraseに、スペースを含む文章が代入されています。
その文章をsplitメソッドを使ってスペースで区切り、文章を単語リストに変換をしています。
そして、その単語リストであるwordsをCounterの引数として渡しました。
ご覧いただけるように、出力結果は単語とその出現回数を格納しています。
Counterの実用的な使い方
ここからはmost_common()メソッドを使ってより実用的なCounterの使い方を学んでいきましょう。
most_common()メソッドとは
most_common()メソッドは、出現回数が多い要素順にCounterオブジェクトを並び替えます。
このメソッドを使うことで結果がより見やすく、扱いやすくなります。
引数にint型の数字nを設定した場合は、出現回数が高い上位n個の要素を返します。
何も設定しなければ、コンテナ型にあるすべての要素を出現回数の順番に並び替えたタプル型オブジェクトを返します。
most_common()メソッドを使ってみよう
では、実際にmost_common()メソッドを使っていきましょう。
こちらのサンプルコードを見てみましょう。
mylist = ["orange","banana","banana", "orange","apple","strawberry", "orange","banana","cherry", "peach","apple","banana"] mycounter = Counter(mylist) for word in mycounter.most_common(): print(word)
実行結果
('banana', 4) ('orange', 3) ('apple', 2) ('peach', 1) ('cherry', 1) ('strawberry', 1)
こちらのサンプルコードでは、most_common()メソッドに引数を設定しませんでした。
すると、mylistの全要素が出現回数の多い順番に並び替えられたタプルとして返ってきました。
では、most_common()メソッドに引数を渡すとどうなるのでしょうか。
mylist = ["orange","banana","banana", "orange","apple","strawberry", "orange","banana","cherry", "peach","apple","banana"] mycounter = Counter(mylist) for word in mycounter.most_common(3): print(word)
実行結果
('banana', 4) ('orange', 3) ('apple', 2)
引数として3と設定したので、もっとも出現回数が多い上位3単語が表示されました。
most_common()メソッドはタプルを返します。
タプルはリストにもよく似ていますが、イミュータブル(変更が出来ない)な点に注意しましょう。
もし中身を変更したい場合は、list()関数でリストに変換する必要があります。
tp_banana = ('banana', 4) ls_banana = list(tp_banana) print(ls_banana)
実行結果
['banana', 4]
タプルがリストに変換されましたね。
タプルについての詳しい解説はこちらの記事をご覧ください。
Pythonの文字列
Pythonは文字列を使用してさまざまな操作をすることが可能です。
文字列の扱いの基本についておさらいしておきたい方は以下の記事も合わせて参考にしてくださいね!
まとめ
今回は、collections.Counterの基本について学びました。
Counterモジュールを使いこなせるようになるとコードを大幅に省略して読みやすくすることが可能になります。
Pythonでコンテナ型の要素の出現回数などを数え上げる事は比較的よくあることなので、覚えておいて損はありません。
collections.Counterを使って、データを綺麗に扱っていきましょう!