アクサンの場合

Python3初心者が段々上達するログ

Python3 リストの中の要素を要素ごとにカウントする

問題

離散データが含まれているリストが与えられたとき, 最頻値を出してよ, とかヒストグラムもいいけど各年齢でどれくらいいるのか教えてよとか言われたりする.

そのとき, カウンティング関数を実装する?しない?面倒だな, 何か使えないか.

解答

Python標準ライブラリに含まれるcollectionsを使う

In [1]: import collections
In [2]: collections.Counter([14, 44, 32, 13, 24, 53, 14, 53, 66, 24])
Out[2]:  Counter({13: 1, 14: 2, 24: 2, 32: 1, 44: 1, 53: 2, 66: 1})

このようになる.カウントはできたが, じゃあこの情報にどうアクセスするのかが重要(あまりにも基礎なことだからか,記載されているブログは少ない).

こいつは,公式にはこのように書かれている.

Counter はハッシュ可能なオブジェクトをカウントする dict のサブクラスです。これは、要素を辞書のキーとして保存し、そのカウントを辞書の値として保存する、順序付けされていないコレクションです。カウントは、0 や負のカウントを含む整数値をとれます。 Counter クラスは、他の言語のバッグや多重集合のようなものです。

ふむ, つまり mydict[ハッシュ値]でアクセスできるということだ.

上記の例だと,

In [4]: mydict[66]
Out[4]: 1

In [5]: mydict[14]
Out[5]: 2

とやればカウント回数をとれる.

次に, カウント回数が最大・最小のキーは何かとか知りたい場合にどうするかを知りたい.

In [16]: max(mydict)
Out[16]: 66

In [17]: min(mydict)
Out[17]: 13

これでは,キーの最大値最小値しかとれていないからNG.

公式に,most_common()なるものがあった.

最も多い n 要素を、カウントが多いものから少ないものまで順に並べたリストを返します。 n が省略されるか None であれば、 most_common() はカウンタの すべての 要素を返します。等しいカウントの要素は任意に並べられます:

なるほど,わからん.試してみると,

In [18]: mydict.most_common()
Out[18]: [(14, 2), (24, 2), (53, 2), (44, 1), (32, 1), (13, 1), (66, 1)]

ここから最大カウントされているキーを取得することができるだろうか. カウントの最大は,

In [25]: max(mydict.values())
Out[25]: 2

で取得できる.じゃあキーはどうなのかは

Python の辞書に含まれる最大値のKeyを求めるクールな実装 - secretbase.log

を参考に以下のように書ける.

In [26]: max(mydict.most_common(), key=itemgetter(1))[0]
Out[26]: 14

うーん,最大値が複数ある場合はキーの最小値が返されるようだ.これではアカン...と思いつつも脱稿.