Python collections.defaultdict

Python学習【365日チャレンジ!】275日目のマスターU(@Udemy11)です。

最近、音声入力にハマっているのですが、めちゃくちゃ精度が上がって、ほぼ正確に認識してくれるので、ほんと使わないのはもったいないですよ。

知り合いにも勧めているのですが、話すのが恥ずかしいのか、あまり使っている人はいないようです。

ほんとびっくりするくらいきちんと変換されるので、ぜひ使ってみてください。

それでは、今日もPython学習を始めましょう。

昨日の復習

昨日は、ChainMapを継承して条件を付与して値を更新する方法を学習しました。

辞書型データのリストを扱えるChainMapですが、辞書型データのvalueint型の時に、条件を付与して値を更新するかどうかを判断させることができました。

ChainMapを継承したクラスをオブジェクト化して、条件によって、値を更新したり、何もしなかったり、新しいkey-valueを追加したりすることができました。

詳しくは昨日の記事をごらんください。

今日は、文字のカウントでコードを短くできるdefaultdictを学習します。

文字カウントの復習

365日Python学習をはじめた頃に、文字列に使われている文字をカウントして辞書型にまとめるコードを学習しました。

かなり前に学習しているので、少し復習してみましょう。

d = {}
l = ['a', 'a', 'a', 'b', 'b', 'c']
for word in l:
    if word not in d:
        d[word] = 0
    d[word] += 1
print(d)

最初の2行で、空のディクショナリdabcの文字を入れたリストlを定義します。

3行目でforループを使ってリストlを回して、ディクショナリdkeyが存在しない場合はvalue0にして値を入れ、keyが存在する場合は、value1を足して、最後にディクショナリdを出力します。

出力結果

{'a': 3, 'b': 2, 'c': 1}

リストlに含まれているa,b,cがそれぞれカウントされて辞書型で表示されています。

setdefault

次にsetdefaultを使って、少しだけコードを短くします。

d = {}
l = ['a', 'a', 'a', 'b', 'b', 'c']
for word in l:
    d.setdefault(word, 0)
    d[word] += 1
print(d)

出力結果

{'a': 3, 'b': 2, 'c': 1}

先ほどと同じように、リストlに含まれるa,b,cがカウントされて辞書型で表示されます。

出力結果は同じですが、setdefaultによって、値が存在しない場合に0を代入するコードが必要なくなり、1行少なくなります。

defaultdict

最後にdefaultdictですが、collectionsライブラリをインポートする必要がありますが、コードはさらに短くすることができます。

import collections

d = collections.defaultdict(int)
l = ['a', 'a', 'a', 'b', 'b', 'c']
for word in l:
    d[word] += 1
print(d)
defaultdict(, {'a': 3, 'b': 2, 'c': 1})

3行目でdに空のディクショナリを定義するのではなく、defaultdict(int)valueint0とするオブジェクトを定義します。

その後は、forループでリストlを回して1ずつ足して、最後に辞書型のdを出力しています。

まとめ

復習もふくめて3つのパターンで同じ結果が得られるコードを書いてみましたが、なんとなく思い出しましたか?

組み込み関数のsetdefaultを使ったり、forループだけで同じことをしたり、表示んライブラリのcollectionsを使ったりしてみましたが、どれを使うかはコードを書く人次第です。

データ(材料)があればそれをどう料理するかはプログラマーの腕の見せどころなので、慌てずじっくりとPythonを学んでいきましょう!

それでは、明日もGood Python!