Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

【python】collections.Counterオブジェクトで文字数を保持する

こんばんは葛の葉です。

個人的な話ですが、Pythonを久しぶりに使うことになりそうなので勉強中です。

久しぶりに触ったらcollections.Counterオブジェクトというものが出てきたので触ってみることにしました。

collections.Counter

collections.Counterは辞書型のサブクラスで、Keyに要素を入れ、valueがそのカウントを保存して使うものらしいです。

公式ドキュメントはこちら↓。

docs.python.org

かの有名な復活の呪文の数をCounterオブジェクトへ

ドラクエ2に出てくる「もょもと」の復活の呪文に出現する「ぺ」の数をカウントして保存してみます。

ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺ
import collections

password = "ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺ"
counter = collections.Counter()
parsed_password = list(password)

for i in parsed_password:
  counter[i] += 1

print(counter)
# Counter({'ぺ': 27, 'う': 4, 'ゆ': 2, 'い': 2, 'や': 2, 'き': 2, 'り': 2, 'て': 1, 'み': 1, 'お': 1, 'む': 1, 'こ': 1, 'ほ': 1, 'じ': 1, 'と': 1, 'ま': 1, 'あ': 1, 'ら': 1})

ぺの数は27個らしい!

ついでにピクル化もしてみよう

Pythonではpickleモジュールを使ったシリアライズとデシリアライズもよくやってるようですのでこちらも使ってみます。

pickleの公式ドキュメントはこちら

docs.python.org

import collections
import pickle

password = "ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺ"
counter = collections.Counter()
parsed_password = list(password)

for i in parsed_password:
  counter[i] += 1

print(counter)# Counter({'ぺ': 27, 'う': 4, 'ゆ': 2, 'い': 2, 'や': 2, 'き': 2, 'り': 2, 'て': 1, 'み': 1, 'お': 1, 'む': 1, 'こ': 1, 'ほ': 1, 'じ': 1, 'と': 1, 'ま': 1, 'あ': 1, 'ら': 1})

with open("count_password.pkl", "wb") as f:
  pickle.dump(counter, f)

こうすることでカレントディレクトリにcount_password.pklというバイナリファイルが作成されます。このバイナリファイルはpythonでロードすることが出来ます。公式ドキュメントにも記載はありましたが、セキュアには出来ないから安全と確信できないピクルは使わないようにとのこと。

import pickle

with open("count_password.pkl", "rb") as f:
  counter = pickle.load(f)

print(counter)
# Counter({'ぺ': 27, 'う': 4, 'ゆ': 2, 'い': 2, 'や': 2, 'き': 2, 'り': 2, 'て': 1, 'み': 1, 'お': 1, 'む': 1, 'こ': 1, 'ほ': 1, 'じ': 1, 'と': 1, 'ま': 1, 'あ': 1, 'ら': 1})

先と同じものが標準出力に表示されました。