もっと便利な道具

INPUT · スライド

それぞれ何個あるかを数える

01 / 07

数えるときに書いていた形

「どの色が何回出てきたか」を数えたい。第2章のやりかたを思い出そう。

空の辞書を用意して、for で回して、まだ無いキーなら1を入れ、あるなら1足す。この6行、書いた覚えがあるはずだよ。

動くし読める。でも「数える」というよくある作業に、毎回この6行を書くのは面倒だよね。

tanngos = ["あか", "あお", "あか", "きいろ", "あか", "あお"]kazoe = {}for t in tanngos:    if t in kazoe:        kazoe[t] += 1    else:        kazoe[t] = 1print(kazoe)

実行結果

{'あか': 3, 'あお': 2, 'きいろ': 1}

02 / 07

Counter に渡すだけ

その6行が、これで終わる。collections という標準ライブラリの中にある Counter(カウンター)を使うよ。

from collections import Counter で名前を持ってきて、数えたいものを渡すだけ。for も if も書かない。

表示すると Counter({...}) という形で出てくる。中身は辞書とほぼ同じだよ。

from collections import Countertanngos = ["あか", "あお", "あか", "きいろ", "あか", "あお"]print(Counter(tanngos))

実行結果

Counter({'あか': 3, 'あお': 2, 'きいろ': 1})

03 / 07

辞書として引ける

Counter は辞書の仲間なので、キーを指定して回数を取り出せる。

うれしいのは、無いキーを引いても KeyError にならず 0 が返ること。ふつうの辞書だとここで止まってしまうところだよ。

「まだ一度も出ていない = 0回」と考えれば、とても自然なふるまいだね。

from collections import Counterkazoe = Counter(["あか", "あお", "あか"])print(kazoe["あか"])print(kazoe["みどり"])

実行結果

2
0

04 / 07

文字列も数えられる

Counter に渡せるのはリストだけではない。回せるものなら何でもいい。

文字列を渡すと、1文字ずつ数えてくれる。文章に使われている文字の頻度を調べる、といったことが1行でできるよ。

from collections import Counterprint(Counter("あいあうあい"))

実行結果

Counter({'あ': 3, 'い': 2, 'う': 1})

05 / 07

多い順に取り出す most_common

most_common(n) を呼ぶと、多い順に上から n 個を取り出せる。

返ってくるのは (名前, 回数) のタプルが並んだリスト。第2章で覚えたタプルがここで出てくるよ。

「いちばん多かったのは何か」を知りたいことは本当によくある。そのための専用の道具だと思っていい。

from collections import Countertanngos = ["あか", "あお", "あか", "きいろ", "あか", "あお"]kazoe = Counter(tanngos)print(kazoe.most_common(2))

実行結果

[('あか', 3), ('あお', 2)]

06 / 07

全部を多い順に回す

most_common() と数を書かずに呼ぶと、全部が多い順に出てくる。

返ってくるのはタプルのリストなので、for で2つに分けて受け取れる。ここまで来ると、集計して表示するプログラムがぐっと短くなるね。

from collections import Counterkazoe = Counter(["あか", "あお", "あか", "きいろ", "あか", "あお"])for tanngo, kaisuu in kazoe.most_common():    print(f"{tanngo}: {kaisuu}")

実行結果

あか: 3
あお: 2
きいろ: 1

07 / 07

数えるならまず Counter

まとめると、Counter が引き受けてくれるのはこれだけのこと。

  • 空の辞書を用意する
  • まだ無いキーかどうか確かめる
  • 1を入れるか、1足すか決める

どれも毎回まったく同じ作業だった。同じことを何度も書くなら、たいていすでに道具がある。それを知っているかどうかだけの差なんだ。

次は「数える」より一歩広い、「まだ無いキーに勝手に初期値を用意してくれる辞書」を見てみよう。