Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

Python入門

【Python入門】collectionsモジュールのCounterサブクラスについての解説

Pythonの便利なcollectionsモジュールが提供する辞書機能を拡張するCounterサブクラスについて初心者向けに解説

今回はPythonに最初から用意されている便利なモジュールの1つ、collectionsモジュールが提供するCounterサブクラスとはどういったものか、そしてどのように使うのか、その基本を簡単に解説します。

なお、collectionsモジュールが提供する便利機能のうち、タプルを拡張するNamaedtupple関数については記事「Pythonのタプルをもっと便利にできるcollectionsモジュールのnamedtuple関数の紹介」で解説しましたので読んでみてください。

公式説明・定義

Python公式ドキュメントには次のように、Counterサブクラスについて説明されています。

Counter はハッシュ可能なオブジェクトをカウントする dict のサブクラスです。これは、要素を辞書のキーとして保存し、そのカウントを辞書の値として保存するコレクションです。カウントは、0 や負のカウントを含む整数値をとれます。 Counter クラスは、他の言語のバッグや多重集合のようなものです。

collections — コンテナデータ型

プログラミングの初心者・入門者にとってはいつもどおり、安定のわかにくさですね。

というわけで、さっそくコード例を見て実際の動作を見てみましょう。実は意外と簡単に理解できます。

collections.Counterの解説

具体例・コード例

非常に簡単なコード例ですが次のコードを見てください。Counterサブクラスからインスタンスオブジェクトを3つつくって、それぞれどのように結果になるか実験するコードです。

if文やfor文などのややこしいものは一切つかっていないので理解しやすいと思います。

1行目

まず1行目では、collectionsモジュールからCounterサブクラスをインポートしています。これでCounterサブクラスが使えるようになります。

3行目

counter_instance_1 = Counter('abc')

まず右辺でCounterサブクラスを使って「abc」という文字列からインスタンスオブジェクトを作成しています。そして、それを左辺のcounter_instance_1へ代入しています。これにより、counter_instance_1というインスタンスオブジェクトが出来上がりました。

Pythonでは文字列はイテラブルオブジェクトです。イテラブルオブジェクトはイメージとしてはそれを構成する要素が1つ1つに分解されて利用されるという感じです。

そしてCounterサブクラスによって、acbという文字列は、a、b、c、という3つの文字に分解されます。

なお、Counter()が取る引数は、イテラブルオブジェクトまたはマッピング型オブジェクト(2022年9月時点では辞書オブジェクトのみ)のうちどちらかです。今回は文字列なのでイテラブルオブジェクトです。

4行目

print(type(counter_instance_1))  # <class 'collections.Counter'>

では、できあがったcounter_instance_1というインスタンスオブジェクトの型を調べています。結果は、「<class ‘collections.Counter’>」という特殊な型です。

第5行目

print(counter_instance_1)  # Counter({'a': 1, 'b': 1, 'c': 1})

この部分では実際にcounter_instance_1の結果を見ています。実行結果は「Counter({‘a’: 1, ‘b’: 1, ‘c’: 1})」となります。

Counter()の中身に注目してください。

{'a': 1, 'b': 1, 'c': 1}

という辞書形式になっていますね。各項目が、「キー(Key): 値(Value)」という形式になっていて、3つの項目があります。

さてそれぞれのキーに対応している数字は一体なにかというと、それは各キーが登場している個数なんですね。文字列abcは、aが1つ、bが1つ、cが1つ使われています。そういう意味です。

このように要素の個数を数える、つまりカウントする機能をCounterサブクラスが持っているのです。だからこそ、上の公式説明では、

要素を辞書のキーとして保存し、そのカウントを辞書の値として保存する

と書かれていたのです。ある要素が何個登場しているのか。それを数える(カウントする)という機能です。

6行目

print(counter_instance_1.values())  # dict_values([1, 1, 1])

values()メソッドを使って、辞書の値(Value)だけを集めた集合を作っています。整数1が3つです。

7行目

print(len(counter_instance_1.values()))  # 3

ここでは、len()関数を使って、6行目で作った辞書の値だけを集めた集合の中に、いくつの要素があるのかを調べています。値「1」が3つ並んでいるだけなので、結果は3となります。

8行目

print(sum(counter_instance_1.values()))  # 3

ここでは、sum()関数を使って、6行目で作った集合にある整数をすべて足した結果を求めています。

その集合の中身は、

1, 1, 1

だったので、全部足して3となります。

9行目以降

さてここまでの説明で9行目からは理解ができると思います。ぜひじっくりと読んでみてください。

愛を分かち合いましょう