Python学習【365日チャレンジ!】275日目のマスターU(@Udemy11)です。
最近、音声入力にハマっているのですが、めちゃくちゃ精度が上がって、ほぼ正確に認識してくれるので、ほんと使わないのはもったいないですよ。
知り合いにも勧めているのですが、話すのが恥ずかしいのか、あまり使っている人はいないようです。
ほんとびっくりするくらいきちんと変換されるので、ぜひ使ってみてください。
それでは、今日もPython学習を始めましょう。
昨日の復習
昨日は、ChainMap
を継承して条件を付与して値を更新する方法を学習しました。
辞書型データのリストを扱えるChainMap
ですが、辞書型データのvalue
がint
型の時に、条件を付与して値を更新するかどうかを判断させることができました。
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行で、空のディクショナリd
とa
、b
、c
の文字を入れたリストl
を定義します。
3行目でfor
ループを使ってリストl
を回して、ディクショナリd
にkey
が存在しない場合はvalue
を0
にして値を入れ、key
が存在する場合は、value
に1
を足して、最後にディクショナリ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)
でvalue
がint
の0
とするオブジェクトを定義します。
その後は、for
ループでリストl
を回して1
ずつ足して、最後に辞書型のd
を出力しています。
まとめ
復習もふくめて3つのパターンで同じ結果が得られるコードを書いてみましたが、なんとなく思い出しましたか?
組み込み関数のsetdefault
を使ったり、for
ループだけで同じことをしたり、表示んライブラリのcollections
を使ったりしてみましたが、どれを使うかはコードを書く人次第です。
データ(材料)があればそれをどう料理するかはプログラマーの腕の見せどころなので、慌てずじっくりとPythonを学んでいきましょう!
それでは、明日もGood Python!