需求:
讀取給定文本文件,統計單詞,計算TOP 10
示例文件爲sample.txt,對其進行單詞統計,不區分大小寫,並顯示單詞重複最多的10個單詞。
思路
1.按行統計,每一行單獨做個列表
2.特殊字符的轉換
3.忽略大小寫
解法1:查找與替換
核心思想就是過濾與替換:
1.定義特殊字符列表
2.對每一行進行操作,然後將每行中的特殊字符替換爲空格,返回列表
3.使用split()來解構每個列表中的單詞
def format(s:str):
word_list=[]
key = set(r"""!()-+*'"/\#.[]{}, \n""") #確定好哪些特殊字符需要進行轉換
format_word = s.lower() #全部化成小寫
for i in format_word: #對該行進行處理
if i in key:
word_list.append(' ') #特殊字符換成空格然後加入列表
else:
word_list.append(i) #一般字符直接加入列表
temp = ''.join(word_list).split() #解構列表,按空格分割,返回新列表,沒有這一步,下面統計的就只是字母
for j in temp:
if j not in word_dict:
word_dict[j] = 1
else:
word_dict[j] += 1
if __name__ == '__main__':
word_dict={}
filename = './sample.txt'
with open(filename, 'r', encoding='utf-8') as f:
for line in f:
format(line)
sort_dict = sorted(word_dict.items(), key=lambda x:x[1],reverse=True) #排序
print(sort_dict[:10])
解法2:字符過濾
1.使用enumerate()來解構每一行,返回包含單詞的列表
2.過濾不需要的字符
3.對每個列表中的每個字符進行判斷,過濾不需要的字符
def format(s:str):
char = s.lower()
key = set("""!()-+*'"/\#[]{},\n""")
word_list = []
for i, v in list(enumerate(char)): #解構每一行,返回列表,列表元素爲元組(索引,單詞)
if v in key:
i += 1
continue
elif v == '.': #點號可能是方法的調用(re.compile()),因此點號兩邊的單詞都要分開計算
word_list.append(' ')
i += 1
else:
word_list.append(v)
i += 1
temp = ''.join(word_list).split()
for j in temp:
if j not in word_dict:
word_dict[j] = 1
else:
word_dict[j] += 1
if __name__ == '__main__':
word_dict={}
filename = './sample.txt'
with open(filename, 'r', encoding='utf-8') as f:
for line in f:
format(line)
sort_dict = sorted(word_dict.items(), key=lambda x:x[1],reverse=True) #排序
print(sort_dict[:10])
解法3:調用re模塊
直接使用re模塊:最簡單
1.調用re.findall對每一行進行處理,找出每個單詞,返回列表
import time
import datetime
import re
with open('sample.txt') as S:
word_dict={}
for line in S:
pattern = re.compile(r"[a-z]*", re.I) #定義匹配表達式,忽略大小寫
word_list = pattern.findall(line) #找出每行的單詞
for word in word_list:
if word not in word_dict:
word_dict[word] = 1
else:
word_dict[word] +=1
word_dict.pop('') #去除空字符
sort_list = list(sorted(word_dict.items(), key=lambda x:x[1],reverse=True))
print(sort_list[0:10])