見出し画像

辞書を使って頻度をカウントする

今日は、『Head First Python』の第3章 構造化データで学んだことをアウトプットします。

Pythonの辞書は、頻度をカウントする際によく使われます。つまり、あるデータを処理して出現回数を格納するのです。

以下のコードは、入力された単語内に含まれる母音の重複しないリストを探し出すものです。

vowels = ['a', 'e', 'i', 'o', 'u']
word = input("単語を入力してください。母音を探します。")
found = []
for letter in word:
   if letter in vowels:
       if letter not in found:
           found.append(letter)
for vowel in found:
   print(vowel)

このプログラムを拡張し、単語内に各母音が何回出現するかの詳細を出力するようにします。

辞書の出力順を指定する

forループの出力をランダムな順序ではなく、a, e, I, o, uの順に変更するには、Pythonの組み込み関数sortedを使います。sorted関数はfound辞書をソートされたリストとして返します。

vowels = ['a', 'e', 'i', 'o', 'u']
word = input("単語を入力してください。母音を探します。")

found = {}
found['a'] = 0
found['e'] = 0
found['i'] = 0
found['o'] = 0
found['u'] = 0

for letter in word:
   if letter in vowels:
       found[letter] += 1
       
for k, v in sorted(found.items()):
   print(k, 'の出現回数は’', v, '回。')上記のコードでは、母音の出現回数が0回のときでもすべての母音を表示します。実際にその母音が含まれるときだけ結果を表示させたいとします。

冒頭に母音を頻度を0に設定する5行のコードがあります。この5行のコードを削除し、出現する母音の回数だけを記録して残りは無視するようにしたいということになります。

実際に初期化コードを削除してみます。

vowels = ['a', 'e', 'i', 'o', 'u']
word = input("単語を入力してください。母音を探します。")

found = {}

for letter in word:
   if letter in vowels:
       found[letter] += 1
       
for k, v in sorted(found.items()):
   print(k, 'の出現回数は’', v, '回。')

実行すると、以下のように、KeyErrorが発生してしまいます。

単語を入力してください。母音を探します。hitch-hiker
Traceback (most recent call last):
 File "/home/toshiya/headfirstpython/vowels4.py", line 8, in <module>
   found[letter] += 1
KeyError: 'i'

辞書のキーは初期化しなければならない

KeyErrorは存在しないキーに対する値にアクセスすると発生します。キーがないため、そのキーに対応する値も見つからないからです。

ならば、初期化コードを復活させればいいのでしょうか?もし初期化コードが膨大な行数になった場合、ループを使って初期化を「自動化」することはできますが、はやり行数の多い大きな辞書を作成することになり、その多くは使わずじまいになる可能性があります。

必要になった時点でキーと値のペアを作成する方法を取るのが賢明です。

setdefaultメソッドを使う

setdefaultは存在しないキーを指定のデフォルト値に初期化するか、または何もしません(つまり、既存のキーに対応する既存の値はそのままになります。

seddefaultを使ってコードを修正すると、以下のようになります。

vowels = ['a', 'e', 'i', 'o', 'u']
word = input("単語を入力してください。母音を探します。")
found = {}

for letter in word:
   if letter in vowels:
       found.setdefault(letter, 0)
       found[letter] += 1
       
for k, v in sorted(found.items()):
   print(k, 'の出現回数は’', v, '回。')

実行してみると、KeyError問題も解決しています。

単語を入力してください。母音を探します。hitch-hiker
e の出現回数は’ 1 回。
i の出現回数は’ 2 回。

setdefaultを使うと、実行時に辞書を動的に拡張し、実際に必要なときにだけ新しいキーと値のペアを作成します。なので、事前に辞書のすべての行を初期化する必要がありません。

サポート、本当にありがとうございます。サポートしていただいた金額は、知的サイドハッスルとして取り組んでいる、個人研究の費用に充てさせていただきますね♪