Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
今回はPythonに最初から用意されている便利なモジュールの1つ、collectionsモジュールが提供するCounterサブクラスとはどういったものか、そしてどのように使うのか、その基本を簡単に解説します。
なお、collectionsモジュールが提供する便利機能のうち、タプルを拡張するNamaedtupple関数については記事「Pythonのタプルをもっと便利にできるcollectionsモジュールのnamedtuple関数の紹介」で解説しましたので読んでみてください。
Contents
Python公式ドキュメントには次のように、Counterサブクラスについて説明されています。
collections — コンテナデータ型
Counter
はハッシュ可能なオブジェクトをカウントするdict
のサブクラスです。これは、要素を辞書のキーとして保存し、そのカウントを辞書の値として保存するコレクションです。カウントは、0 や負のカウントを含む整数値をとれます。Counter
クラスは、他の言語のバッグや多重集合のようなものです。
プログラミングの初心者・入門者にとってはいつもどおり、安定のわかにくさですね。
というわけで、さっそくコード例を見て実際の動作を見てみましょう。実は意外と簡単に理解できます。
非常に簡単なコード例ですが次のコードを見てください。Counterサブクラスからインスタンスオブジェクトを3つつくって、それぞれどのように結果になるか実験するコードです。
if文やfor文などのややこしいものは一切つかっていないので理解しやすいと思います。
まず1行目では、collectionsモジュールからCounterサブクラスをインポートしています。これでCounterサブクラスが使えるようになります。
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月時点では辞書オブジェクトのみ)のうちどちらかです。今回は文字列なのでイテラブルオブジェクトです。
print(type(counter_instance_1)) # <class 'collections.Counter'>
では、できあがったcounter_instance_1というインスタンスオブジェクトの型を調べています。結果は、「<class ‘collections.Counter’>」という特殊な型です。
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サブクラスが持っているのです。だからこそ、上の公式説明では、
要素を辞書のキーとして保存し、そのカウントを辞書の値として保存する
と書かれていたのです。ある要素が何個登場しているのか。それを数える(カウントする)という機能です。
print(counter_instance_1.values()) # dict_values([1, 1, 1])
values()メソッドを使って、辞書の値(Value)だけを集めた集合を作っています。整数1が3つです。
print(len(counter_instance_1.values())) # 3
ここでは、len()関数を使って、6行目で作った辞書の値だけを集めた集合の中に、いくつの要素があるのかを調べています。値「1」が3つ並んでいるだけなので、結果は3となります。
print(sum(counter_instance_1.values())) # 3
ここでは、sum()関数を使って、6行目で作った集合にある整数をすべて足した結果を求めています。
その集合の中身は、
1, 1, 1
だったので、全部足して3となります。
さてここまでの説明で9行目からは理解ができると思います。ぜひじっくりと読んでみてください。