辞書オブジェクトを使ってなんでも数える
辞書オブジェクトを使うことで、例えば、
[1,2,3,3,3,32,2,2,21,1,2,2,2,1,1]
上記のリストには何の数字が何個ありますか?
["cat","dog","cat","doog","dog","cat","caat"]
上記リストには何の動物が何匹いますか?
"aabbdkaokkdoa"
上記の文字列には何の文字が何個使われていますか?
これを使ったプログラムを下記で例示してみましょう。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def my_count(itr_data): | |
my_dict = {} | |
for k in itr_data: | |
my_dict[k] = my_dict.get(k, 0) + 1 | |
return(my_dict) | |
各要素をキーにする
数える対象の要素をそのままKeyにするのが味噌です。上記の例題にもあるように、大体の数えるものは、数値、文字、文字列であり、これらオブジェクトはそのまま辞書オブジェクトのキーになれるので、放り込めばよいだけです。
カウントの処理で出会いがちなKeyError
ここで、辞書オブジェクトは、存在しないキーの問い合わせをdict_obj[key]という形で受けると、KeyErrorが送出されるようになっています。ですから、4行目の処理を
my_dic[k] += 1
というカウント処理でよく見かける単純な処理にするとエラーになります。
このような処理は、
my_dic[k] = my_dic[k] + 1
実は、このような処理と同値となります。
ここで、数えている要素が初めて出会ったもので、まだ、my_dicオブジェクトにkeyとして存在しない場合、色付きで示したイコールの後ろにある「my_dic[k] 」の部分でKeyErrorが出てしまいます。(つまり、数え始めにはすべてエラーとなる)
このようなことから、本来はkeyが辞書オブジェクト内にあるのか無いのかの場合分けをする必要があるのですが、get()メソッドを使うとこの問題が解決されます。
get()メソッドには、第二引数でkeyが存在しない時に返すデフォルト値を指定できるので、これを使うことで上記4行目のように処理がスムーズに書けます。
試してみよう
Jupyter Notebook や ipythonを使って、上記例示プログラムで例題を試してみましょう。
まずは、よくある文字列のリスト
>>> itr_data = ["cat","dog","cat","doog","dog","cat","caat"] >>> print(my_count(itr_data)) {'cat': 3, 'doog': 1, 'caat': 1, 'dog': 2}
文字列自体が、辞書オブジェクトのキーになるのは感覚的に分かりやすいでしょう。
次に、数値のリストを渡した場合
>>> itr_data = [1,2,3,3,3,32,2,2,21,1,2,2,2,1,1] >>> print(my_count(itr_data)) {32: 1, 1: 4, 2: 6, 3: 3, 21: 1}
数値も辞書オブジェクトのキーになれます。
最後に、文字列に含まれる文字を数えます。
>>> itr_data = "aabbdkaokkdoa" >>> print(my_count(itr_data)) {'b': 2, 'o': 2, 'k': 3, 'a': 4, 'd': 2}
Pythonの文字列は、イテレイタで、リストに一文字づつ入っているかのように扱えます。ですから、例示関数3行目のfor構文では、inの後ろに文字列を置くとによって、変数cに一文字づつ取り出し、その処理ができるのです。
辞書オブジェクトを使ってなんでも数える
Reviewed by shunsk
on
6/28/2018
Rating:
No comments: