身為一個半路跑去學Python 的少年,上學期看了不少書,但練習地少,這學期我就多練練,今天就亮一手寫個簡單(隻考慮程式的性能和可拓展性,沒有考慮健壯性)的文本統計腳本,歡迎内行的人來指教

#coding=utf-8
'''
author:Frank.ZhangLongqi
Date:2018-3-17
function:
對一清單内的元組進行分類,相同的分為一類,并計數,将結果寫入字典
解法:把該清單轉化為預設字典(key值相同的value将會合并為list()),
再對合并後的d.values()進行分别求和,最後将d.keys()和d.values()進行
dic(zip(list1,list2))合并成字典即可;以下提供了2種形成預設字典的方法
分别為count_word1和count_word2
'''
#*********************#導入區
import collections
import time
import operator
#*******************************************8#初期化區
d = collections.defaultdict(list)
value_set = {}
#********************************************#函數區
def read_file(filename):
with open(filename,encoding="utf-8") as f:
while True:
c=f.read(1)
if not c:
break
else:
yield (c,1)#生成器,占記憶體少
def count_words1(filename):
global value_set
for tup in read_file(filename):#調用生成器
k,v=tup[0],tup[1]
value_set.setdefault(k,list()).append(v)
word,counts =value_set.keys(),value_set.values()
l=[]
for i in counts:
l.append(sum(i))
return dict(zip(word, l)) #合并清單為字典
def count_words2(filename):
global d
for tup in read_file(filename):
k,v = tup[0],tup[1]
d[k].append(v)
word,counts =d.keys(),d.values()
l=[]
for i in counts:
l.append(sum(i))
return dict(zip(word, l)) #合并清單為字典
#*******************************************#主函數區
if __name__ == '__main__':
filename = "G:\第5學期\朋友.txt"
#tup=read_file(filename)
start=time.clock()
result1 = count_words1(filename)
mid=time.clock()
result2 = count_words2(filename)
end=time.clock()
result_tmp=sorted(result1.items(),key=operator.itemgetter(1),reverse=True)#給統計結果排序
result_1=dict(result_tmp)
print("results1:{0}\n && internal:{1}".format(result_1,mid-start))
print("results2:{0}\n && internal:{1}".format(result2,end-mid))
運作結果截圖: