PythonのCounterで要素の出現回数を調べる様々な方法

PythonのCounter関数は、リストやタプル、辞書、文字列などの中の要素の数をわかりやすく取得することができる便利な関数です。要素を数えるには「countメソッド」もありますが、Counter関数は、それと違って、全ての要素の数を一括で取得してくれます。ここでしっかりマスターしておきましょう。

目次

1. Counter関数の書き方

PythonのCounter関数は次のように書きます。

In [ ]:
''' collections.Counter関数の書き方'''
import collections  #  collectionsライブラリのインポートが必須です。
collections.Counter(イテラブル)  #  Counterは大文字のCです。

まず、Counter関数はcollectionsライブラリの関数なので、「import collections」でライブラリをインストールする必要があります。これを忘れると、Counter関数は使えませんのでご注意ください。

Counter関数を使うときは「collections.Counter」と書いて、引数に要素の個数を調べたいイテラブルを渡します。イテラブルとは、要素を順番に取り出すことができるオブジェクトのことです。難しく考えすぎずに、文字列、リスト、タプル、辞書などのことだと考えれば大丈夫です。

それでは実際に見ていきましょう。

2. Counter関数の使い方

2.1. 基本的な使用例

次のコードをご覧ください。リストを作り、そのリストにcollections.Counter関数を使っています。

In [1]:
#  リストの要素の個数を調べる
import collections  #  collectionsライブラリのインポートが必須です。
list = ['a', 'b', 'c', 'a', 'b', 'b']
clist = collections.Counter(list)
print(clist)

#  返り値はcollections.Counter型(辞書の子クラス)
print(type(clist))
Counter({'b': 3, 'a': 2, 'c': 1})
<class 'collections.Counter'>

結果を見てみると、リスト内のそれぞれの要素の個数が辞書形式で返っていますね。次にtype関数でcollections.Counterの返り値の型を調べています。見てみると、’collections.Counter’と出ています。isinstace関数で調べると、collections.Counter型は、辞書型のサブクラスであることがわかります。

In [2]:
isinstance(clist, dict)
Out[2]:
True

なおtype関数とisinstance関数は、『Pythonの変数の型を調べる方法』で解説しているのでご確認ください。

また、辞書型なので次のようにキーに対応する値をスライスすることができます。

In [4]:
''' スライスで指定の要素の個数だけ取り出せます。 '''
print(clist['a'])
print(clist['b'])
print(clist['c'])
print(clist['d'])  #  存在しないものを指定した場合は0が返ってきます。
2
3
1
0

これについては、『Pythonの辞書(dict)のキーの存在や値を調べたり取り出したりする方法まとめ』をご確認ください。

2.2. keys(),values(),items()を使う

collections.Counter関数の返り値が辞書型のサブクラスということは、辞書メソッドを使うことができるということを意味しています。次のコードでは、Counter関数の返り値に対して、辞書メソッドの

  • keys():辞書の要素からキーだけ取り出す。
  • values():辞書の要素から値だけ取り出す。
  • items():辞書の要素のキーと値を取り出す。

を使っています。

In [3]:
''' 返り値は辞書のサブクラスなので辞書のメソッドを使えます。 '''
print(clist.keys())
print(clist.values())
print(clist.items())
dict_keys(['a', 'b', 'c'])
dict_values([2, 3, 1])
dict_items([('a', 2), ('b', 3), ('c', 1)])

それぞれ、辞書型のメソッドが使えていることが確認できますね。辞書の基本的な操作についても『Pythonの辞書(dict)のキーの存在や値を調べたり取り出したりする方法まとめ』で解説しています。

2.3. Counterを他のオブジェクトに使う

Pythonのcollections.Counter関数はリストだけではなく、タプルや文字列、辞書に対しても使うことができます。次のコードを確認しておきましょう。

In [1]:
''' リスト、タプル、文字列、辞書'''
import collections
#  リスト
list = ['a', 'b', 'c', 'a', 'b', 'b']
clist = collections.Counter(list)
print(clist)
#  タプル
tuple = ('a', 'b', 'c', 'a', 'b', 'b')
ctuple = collections.Counter(tuple)
print(ctuple)
#  文字列
str = 'abcabb'
cstr = collections.Counter(str)
print(cstr)
#  辞書
dict = {'a':2, 'b':3, 'c':1}
cdict = collections.Counter(dict)
print(cdict)
Counter({'b': 3, 'a': 2, 'c': 1})
Counter({'b': 3, 'a': 2, 'c': 1})
Counter({'b': 3, 'a': 2, 'c': 1})
Counter({'b': 3, 'a': 2, 'c': 1})
Counter({'c': 1, 'b': 1, 'a': 1})

それぞれ同じように、要素の数が数えられていますね。

2.4. Counter型データの集合演算

collections.Counter関数の返り値であるcollections.Counter型のデータでは、set(集合)型のように集合演算を行うことができます。

2.4.1. 演算子を使った集合演算

以下をご覧ください。

In [2]:
''' collections.Counter型のオブジェクトは演算が可能です。 '''
import collections

c1 = collections.Counter(['a', 'b', 'c', 'a', 'b', 'b'])
c2 = collections.Counter('alpabet')
print(f'c1:{c1}')
print(f'c2:{c2}')

#  c1+c2(和集合)
print(f'c1+c2:{c1+c2}')
#  c1-c2(差集合)
print(f'c1-c2:{c1-c2}')
#  c1&c2(論理積)
print(f'c1&c2:{c1&c2}')
#  c1|c2(論理和)
print(f'c1|c2:{c1|c2}')
c1:Counter({'b': 3, 'a': 2, 'c': 1})
c2:Counter({'a': 2, 'l': 1, 'p': 1, 'b': 1, 'e': 1, 't': 1})
c1+c2:Counter({'a': 4, 'b': 4, 'c': 1, 'l': 1, 'p': 1, 'e': 1, 't': 1})
c1-c2:Counter({'b': 2, 'c': 1})
c1&c2:Counter({'a': 2, 'b': 1})
c1|c2:Counter({'b': 3, 'a': 2, 'c': 1, 'l': 1, 'p': 1, 'e': 1, 't': 1})

集合演算については、『Pythonのset(集合)の基礎知識と抑えておきたい操作方法まとめ』で解説しています。

2.4.2. Counterはupdateメソッドも可能

細かいですが、collections.Counter型のオブジェクトには、集合演算の中の和集合を計算してくれるupdateメソッドが可能です。

In [1]:
''' collections.Counter型のオブジェクトは演算が可能です。 '''
import collections


#  updateメソッド(和集合)
c1 = collections.Counter(['a', 'b', 'c', 'a', 'b', 'b'])
c2 = collections.Counter('alpabet')
c1.update(c2)
print(f'updateメソッド:{c1}')
updateメソッド:Counter({'a': 4, 'b': 4, 'c': 1, 'l': 1, 'p': 1, 'e': 1, 't': 1})

差集合のdifference()や、積集合のintersection()、対称差集合のsymmetric_difference()は使えません。

3. most_commonメソッドで要素の出現回数を取得

Pythonのcollections.Counter型のオブジェクトには、most_commonメソッドといって、各要素の出現回数の順番にタプル形式、複数の場合はタプルinリスト形式でデータを取得できるメソッドがあります。

実際に見てみましょう。

In [1]:
''' リスト、タプル、文字列、辞書'''
import collections
list = ['a', 'b', 'c', 'a', 'b', 'b']
clist = collections.Counter(list)
print(clist)

print(clist.most_common())
Counter({'b': 3, 'a': 2, 'c': 1})
[('b', 3), ('a', 2), ('c', 1)]

スライスを活用することで様々な方法で要素の出現回数の取得が可能です。

In [2]:
''' 出現回数がもっとも多いものだけ調べる。 '''
print(clist.most_common()[0])  #  0でインデックス指定

''' 出現回数がもっとも少ないものだけ調べる '''
print(clist.most_common()[-1])  #  -1でインデックス指定

''' 出現回数が少ない順に並べる  '''
print(clist.most_common()[::-1])  #  スライスと同じやり方で逆順

''' 多次元リストと同じ方法でスライスも可能 '''
print(clist.most_common()[0][0])  #  インデックス番号0番の中の0番
print(clist.most_common()[2][1])  #  インデックス番号2番の中の1番
('b', 3)
('c', 1)
[('c', 1), ('a', 2), ('b', 3)]
b
1

リストやタプルの要素のスライスや抽出について不安な方は『Pythonのリストからの要素の取り出し方法のまとめ』や『Pythonのリストのスライスと分割の方法まとめ』で復習しておくと良いでしょう。

4. まとめ

PythonのCounter関数はcollectionsライブラリの機能です。そのため使用するにはcollectionsのインポートが必須です。また、collections.Counter関数の返り値はcollections.Counter型です。これは辞書のサブクラスのため、keys()、values()、items()辞書で使えるメソッドを使用することができます。

また、collections.Counter型オブジェクトでは集合演算を行うこともできます。

最後に、most_commonメソッドを使うと、さらに細かい条件で任意の要素の出現回数を調べることができます。Counter関数とmost_commonメソッドはセットのようなものなので、自由に任意の要素の出現回数を取得できるように、色々試して慣れておきましょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる