版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
#文本词频统计
def getText():
txt = open("E:\python学习\python_work\hamlet.txt","r").read()
txt = txt.lower()
for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~': #通过for循环,依次取出!等特殊字符赋值给ch
txt = txt.replace(ch," ") #取出特殊字符后,将txt中!全部替换成空格后,再通过for循环依次将剩余的特殊字符全部替换
return txt
hamletTxt = getText()
words = hamletTxt.split() #以“空格”为分隔符
counts = {} #初始一个”空字典“,因为单词和次数要形成映射,所以需要把words列表,改成“字典“,方便映射统计
for word in words:
counts[word] = counts.get(word,0)+1
#word字典类型,counts.get(word,0),表示如果word存在返回键值,如果word不存在,返回0
'''刚开始字典counts是空的,所以words列表里面的任何字符,都不在counts字典里,因此第一次索引到的字符,都是不存在,为0+1,
例如a首次遇到,则为a:1,当首次添加字符到字典后,第二次再遇到相同字符时,值1+1=2,为a:2,并将2赋值给counts[a]'''
items = list (counts.items()) #counts.item(),转换成[(a,2),(b,1),.....],的元组类型,list将元组类型转换成列表类型
items.sort(key=lambda x:x[1],reverse=True) #lambda定义x,及需要排列的元素,x[1],代表对元组第二个元素进行排列
for i in range(10):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
#0和1表示位置,0对应word,1对应count
#<表示左对齐,>表示右对齐,数字表示宽度。同理,题中<10表示左对齐,并占10个位置,>5表示右对齐,占5个位置。