2018年3月25日日曜日

Python リストの中身の頻度をカウントをする

リストの中身をにしてカウントしたい

groupbyを使う方法

a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
from itertools import groupby
[len(list(group)) for key, group in groupby(a)]
https://stackoverflow.com/questions/2161752/how-to-count-the-frequency-of-the-elements-in-a-list


これでできる、と思ったら、グループなので、全体からの合計カウントではない。1,1,1,..2,2,..が順に並んでいないとカウントしてくれない。

例えば
a = [5,1,1,1,2,2,2,2,3,3,4,5,5]
となったときを考える。

数字をカウントしているから分かりにくい・・・。
keyも見るためにタプルにする 👉 (key, count)
In:
a = [5,1,1,1,2,2,2,2,3,3,4,5,5]
[(key, len(list(group))) for key, group in groupby(a)]
Out:
[(5, 1), (1, 3), (2, 4), (3, 2), (4, 1), (5, 2)]
... 5が1回、1が3回、、、となり冒頭の5が1回だけカウントされます。

Pythonのlist.countを使うと解決

setにして重複を外してから、listに戻す、listの中身をkeyにしてcountする
In:
a = [5,1,1,1,2,2,2,2,3,3,4,5,5]
[(key, a.count(key)) for key in list(set(a))]
Out:
[(1, 3), (2, 4), (3, 2), (4, 1), (5, 3)]

別の方法: sortする

sortすればグループでできる。
a のリストを sorted(a) でソートする
[(key, len(list(group))) for key, group in groupby(sorted(a))]
とやれば同じ。どちらが良いのかというのはちょっと判断つきません。

 具体的な使用例

 テキストで同じ行が繰り返されていたら削除したいときに使いました
 改行が'\n' だったので
text_str_all.split('\n') 
で文字列を分割してから重複をカウント

0 件のコメント:

コメントを投稿