collectionsモジュールのCounterとdefaultdictを極める【Python tips】

Python

独習Python [ 山田 祥寛 ]

 

こんにちは、monachan_papaです。

Pythonプラグラミングにおいて、リスト型や辞書型をまとめて操作する、ということはほぼ当然のようにあります。
このとき、いかにシンプルに、そして楽にコードを書くか、つまり効率化は大変重要なテーマです。

Pythonには標準モジュールの中に、collectionsモジュール というものがあり、これを使うと効率化に一役買ってくれます。

何はともあれ、collectionモジュールをインポートします。
collectionsモジュールで使用頻度の高い、defaultdictクラスCounterクラス を指定します。

from collections import defaultdict, Counter

以降で、これらのクラスについて、詳しく見ていきます。
特に Counterクラスはとてつもなく便利で、内容によってはこれを使わずしてコードを書くのはナンセンス、そう思えるくらいのクラスです。

defaultdictクラス

ピコ太郎でお馴染みのPPAP。これをもとに、まずは以下のテストデータを作ります。

ppap = 'penpineappleapplepen'
ppap
'penpineappleapplepen'

ペン、パイナップル、アップル、ペンの英単語を単純に繋げただけの文字列です。
このとき、各アルファべット一文字一文字がそれぞれ何回登場するか、登場回数カウントをするシーンがあったとします。
その際、辞書型オブジェクトを作って key にアルファベット、value に登場回数を設定するのがセオリーかと思います。
普通にやると、以下のようなコードになります。

cnt_ppap = {}

for k in ppap:
    if k in cnt_ppap:
        cnt_ppap[k] += 1
    else:
        print(f'keyに {k} がなかったので、設定しました。')
        cnt_ppap[k] = 1

cnt_ppap
keyに p がなかったので、設定しました。
keyに e がなかったので、設定しました。
keyに n がなかったので、設定しました。
keyに i がなかったので、設定しました。
keyに a がなかったので、設定しました。
keyに l がなかったので、設定しました。


{'p': 7, 'e': 5, 'n': 3, 'i': 1, 'a': 2, 'l': 2}

いちいち、key の存在チェックをしないといけない。 とにかく面倒くさいです。
しかし、defaultdictクラス を使うと、以下のようなコードにできます。

cnt_ppap = defaultdict(int)

for k in ppap:
    cnt_ppap[k] += 1

cnt_ppap
defaultdict(int, {'p': 7, 'e': 5, 'n': 3, 'i': 1, 'a': 2, 'l': 2})

結果を見るに、正しく登場回数カウントが出来ています。そして、シンプルに楽でした。
defaultdictクラスは、組み込みの辞書型を継承したクラスで、使い方がほぼ同じです。よって、組み込みの辞書型をしっかり理解できている御方であれば、特に苦労することなく直感的に諸々の操作ができるかと思います。

さて、括弧の中に引数 int を指定していますが、何を隠そうこの正体は int関数で、これが一役買ってくれているのです。
もし、存在していない key が指定された場合、int関数は自動的に を返却してくれるからです。
defaultdict という名前からも分かるように、規定値を持った辞書定義 というわけです。

cnt_ppap['x']
0

defaultdictクラス、とても便利ですね。


独習Python [ 山田 祥寛 ]

Counterクラス

次は collectionsモジュールの最強クラス、と私が思っている Counterクラス です。
名前からも分かる通り、データの個数カウントをしてくれます。defaultdictクラスと同様、組み込みの辞書型を継承したクラスです。

さきほどの defaultdictクラスの例で、単純に個数カウントをするだけならば、Counterクラスを使った方がさらに便利で、しかも瞬殺です。

cnt_ppap = Counter(ppap)
cnt_ppap
Counter({'p': 7, 'e': 5, 'n': 3, 'i': 1, 'a': 2, 'l': 2})

あっという間に出来ました。
要素へのアクセスについても、以下の通り。

cnt_ppap['p']
7

存在しない key を指定した場合も、以下の通り。エラーを出すことなく、 を返却します。

cnt_ppap['x']
0

そして、さらに便利なメソッドがあります。

most_commonメソッド です。

most_commonメソッドは、個数カウントの多い順に並べ替えることができます。
ただし、結果はリスト型になっていることに注意してください。

cnt_ppap.most_common()
[('p', 7), ('e', 5), ('n', 3), ('a', 2), ('l', 2), ('i', 1)]

引数に数値を指定すれば、カウント上位だけ取り出すことも可能です。上位3件なら、以下の通りです。

cnt_ppap.most_common(3)
[('p', 7), ('e', 5), ('n', 3)]

Counterクラス、かなり便利です。これはもう使わずにはいられません。


以上、collectionsモジュールの 最頻出といっても過言でないdefaultdictクラス、Counterクラスについての解説を終わります。
これらをマスターして、今後のPythonプログラミングの効率化にお役立ていただけたら、と思います。

なお、collectionsモジュールをもっと詳しく知りたい、さらなるスキルアップを目指したい、という貪欲な御方は、独習Python [ 山田 祥寛 ]で学習すると、組み込み型の辞書も含めて完璧になると思います。章ごとに練習問題もたくさんついていて、インプット・アウトプットでしっかり身になるはずです。


独習Python [ 山田 祥寛 ]

コメント

タイトルとURLをコピーしました