一:题目要求
对于一个已分词的句子(可方便地扩展到统计文件中的词频):
我/是/一个/测试/句子/,/大家/赶快/来/统计/我/吧/,/大家/赶快/来/统计/我/吧/,/大家/赶快/来/统计/我/吧/,/重要/事情/说/三遍/!
可以用collections模块中的Counter()函数方便地统计词频,例如可用如下代码:
import collections
import copy
s = "我/是/一个/测试/句子/,/大家/赶快/来/统计/我/吧/,/大家/赶快/来/统计/我/吧/,/大家/赶快/来/统计/我/吧/,/重要/事情/说/三遍/!/"
s_list = s.split('/')
# 为避免迭代时修改迭代对象本身,创建一个列表的深拷贝,也可用s_list_backup = s_list[:]
s_list_backup = copy.deepcopy(s_list)
[s_list.remove(item) for item in s_list_backup if item in ',。!”“']
collections.Counter(s_list)
这个问题也可以通过字典来解决,请编写用字典解决本问题的程序,为便于OJ系统自动判断,程序最后输出某个单词的词频。
程序参考框架
def countfeq(s):
... ...
return a dict
if __name__ == "__main__":
s = "Not clumsy person in this world, only lazy people, only people can not hold out until the last."
s_dict = countfeq(s.lower())
word = input()
基于s_dict判断word的词频并输出(可能是0次)
输入格式:字符串
输出格式:整数
输入样例(因为oj系统限制,测试用例设为判断英文单词个数(不区分大小写,全部转换成小写字符处理),请注意英文标点,假设仅包含,和.):not
输出样例:2
二:代码实现
'''方法一:字典实现'''
import string
def countfeq(s):
s=s.split()
s_dict={}
for i in s:
if i in s_dict.keys():
s_dict[i]+=1
else:
s_dict[i]=1
return s_dict
if __name__ == "__main__":
s = "Not clumsy person in this world, only lazy people, only people can not hold out until the last."
table=s.maketrans(string.punctuation,' '*len(string.punctuation))
s=s.translate(table)
s_dict = countfeq(s.lower())
word = input()
if word in s_dict.keys():
print(s_dict[word])
else:
print(0)
'''方法二:简便运算'''
import string
import collections
def countfeq(s):
s=s.split()
s_dict=collections.Counter(s)
return s_dict
if __name__ == "__main__":
s = "Not clumsy person in this world, only lazy people, only people can not hold out until the last."
table=s.maketrans(string.punctuation,' '*len(string.punctuation))
s=s.translate(table)
s_dict = countfeq(s.lower())
word = input()
if word in s_dict.keys():
print(s_dict[word])
else:
print(0)
三:总结
此题比较简单,重点在于如何对字符串的标点符号进行处理。
(1)在python中,想要对字符串s进行分割,通常使用s.split(str)函数,str表示以str为界限进行分割。如果想要以一个或多个空格作为分割符,直接使用s.split()即可。
(2)处理标点符号的常用代码为:
import string
s = "Not clumsy person in this world, only lazy people, only people can not hold out until the last."
table=s.maketrans(string.punctuation,' '*len(string.punctuation))
s=s.translate(table)
print(s)
其中str.maketrans(str1,str2)是字符串替换方法,和str.replace(str1,str2)方法的功能相同,都是用str2来替换字符串str中的str1。区别在于replace方法不要求str1和str2的长度,而maketrans方法要求str1和str2的长度必须相同。
maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
maketrans()方法语法:
str.maketrans(intab, outtab)
参数
- intab -- 字符串中要替代的字符组成的字符串。
- outtab -- 相应的映射字符的字符串。
返回值
返回字符串转换后生成的新字符串。
str.translate(table)方法是根据参数table给出的表(包含 256 个字符)转换字符串的字符,要过滤掉的字符放到 deletechars 参数中。
translate()方法语法:
str.translate(table)
bytes.translate(table[, delete])
bytearray.translate(table[, delete])
参数
- table -- 翻译表,翻译表是通过 maketrans() 方法转换而来。
- deletechars -- 字符串中要过滤的字符列表。
返回值
返回翻译后的字符串,若给出了 delete 参数,则将原来的bytes中的属于delete的字符删除,剩下的字符要按照table中给出的映射来进行映射 。