Pythonのカウンター

Pythonで大きなファイルから,ある要素の個数をカウントするプログラムを書いた.

何も考えずに書いたら結構な時間のかかるバカプログラムになってしまったので,そのメモ

やろうとしたこと:
1行1単語(日本語)のファイルから,全ての単語を出現頻度順に並び替え,その個数も表示する.
100 単語1
90 単語2
・・・

やったこと:
1.とりあえず1単語ずつリストに全部突っ込む
2.重複なしリストをつくる
3.全ての単語について,元のリストから個数を数えてリストをつくる([100,90,…]
4.zipして([単語1,100],[単語2,90]…)個数順にソート
何も考えてないプロセスであるが,これを馬鹿正直に書いたのがこれ

# -*- coding: utf-8 -*-
import sys

col = []

for line in sys.stdin:
	col.append(line)

uniqList = list(set(col))
num_list = []

for i in range(len(uniqList)):
	num_list.append( col.count(uniqList[i]) )

lst = sorted(zip(num_list,uniqList), key=lambda x:x[0], reverse=True)

for i in range(len(uniqList)):
	print(str(lst[i][0]) + '\t' + lst[i][1]),

80万行くらいのファイルにかけたら3時間ほどかかった.(Sundy-Bridgeのi5で)
ちょっと遅すぎる(こんだけループ回して数えたら当たり前).

調べてみると,Counterというのがあるらしい.
どうもハッシュで整理しながら高速にカウントしてくれるようだ.
使ってみたのが↓

# -*- coding: utf-8 -*-
import sys
from collections import Counter

col = []

cnt = Counter()
for line in sys.stdin:
 if line.rstrip():
 cnt[line.rstrip()] += 1

for key,value in cnt.most_common(100):
 print key,value

1秒くらいでいけた\(^o^)/
しかも,.most_commonで多い順に表示してくれる.
most_common()で何も入れないと,全てをランキングしてくれる.数字を入れると上位その数字文だけを出力してくれる.

なんて楽(*´∀`)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です