
独習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関数は自動的に 0 を返却してくれるからです。
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 を指定した場合も、以下の通り。エラーを出すことなく、0 を返却します。
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 [ 山田 祥寛 ]
コメント