python编程 统计英语文章词频 文本操作 继承
统计英语6级试题中所有单词的词频,并对词频进行排序
import re
# 请根据处理要求下面区域完成代码的编写。
def get_artical(artical_path):
with open(artical_path) as fr:
data = fr.read()
return data
#处理函数
def handle(data):
counts = {}
#data = data.lower()
data1 = re.sub('\n',' ',data)#替换换行符为空格
reg = "[^A-Za-z\']"
data = re.sub(reg,' ',data1)#只保存英文,同时保留don't isn't类似单词
data = data.lower()
list_data = data.split()#列表
#遍历统计
for word in list_data:
if word in counts.keys():
counts[word] = counts[word] +1
else:
counts[word] = 1
return counts
# get_artical()为自定义函数,可用于读取指定位置的试题内容。
data = get_artical('./artical.txt')
re_counts = handle(data)
re_counts = sorted(re_counts.items(),key=lambda x:x[1],reverse=True)#词频从大到小排序,
print(re_counts)
打印效果如下
对字典进行排序时,需要使用.items()函数,先将字典转为元组。
定义Student类,包括name、dob、age、gender和score属性,包括top3方法用来返回学生的最大的3个成绩(可重复)、sanitize方法用来将负的分数变为正的分数,负的分数可能是输入错误。声明stu_list对象组数用于存储所有的学生对象。最后输出所有的学生信息包括姓名、生日、年龄、性别、最高的3个分数。
import os
#Student类
class Student:
def __init__(self,a_name,a_dob,a_age,a_gender,a_score):
self.name = a_name
self.dob = a_dob
self.age = a_age
self.gender = a_gender
self.score = a_score
def top3(self):
return sorted(set([self.sanitize(t) for t in self.score]),reverse=True)[0:3]
def sanitize(self,score_string):
if '-' in score_string:
score_string = abs(int(score_string))
else:
score_string = int(score_string)
return score_string
#获取work路径下的类型为txt的文件的数据函数
def get_data(filename):
with open(filename) as f:
line = f.readline()
return line.strip().split(',')
#创建学生对象函数
def create_stu(stu_data):
stu = Student(stu_data.pop(0),stu_data.pop(0),stu_data.pop(0),stu_data.pop(0),stu_data)
return stu
#打印学生信息函数
def print_stu(stu):
print('姓名:%s,生日:%s,年龄:%s,性别:%s,分数:%s' %(stu.name,stu.dob,stu.age,stu.gender,stu.top3()))
data1 = get_data('/home/aistudio/work/stu1.txt')
data2 = get_data('/home/aistudio/work/stu2.txt')
data3 = get_data('/home/aistudio/work/stu3.txt')
data4 = get_data('/home/aistudio/work/stu4.txt')
#打印原始数据
print("原始数据")
print(data1)
print(data2)
print(data3)
print(data4)
#创建学生对象
print("创建的学生对象:")#对象有点多,就写了一个创建对象的函数,很方便
stu_1 = create_stu(data1)
stu_2 = create_stu(data2)
stu_3 = create_stu(data3)
stu_4 = create_stu(data4)
print_stu(stu_1)
print_stu(stu_2)
print_stu(stu_3)
print_stu(stu_4)
打印效果如下
新增了特长学生,有自己的特长分数。定义Spostudent、Artstudent为Student的子类,在子类的属性里面新增了spe为特长分数。Spostudent包括的top3方法返回的是最低的3个得分(可重复),Artstudent包括top3方法返回的是最高的3个得分(可重复),最后使用多态的方式输出2个特长同学的姓名、生日、年龄、性别、分数、特长分。
#class Spostudent
class Spostudent(Student):
def __init__(self,a_name,a_dob,a_age,a_gender,a_spo_score,a_score):
Student.__init__(self,a_name,a_dob,a_age,a_gender,a_score)
self.spo_score = a_spo_score
def top3(self):
return sorted(set([self.sanitize(t) for t in self.score]))[0:3]#返回最低的3个分数
class Artstudent(Student):
def __init__(self,a_name,a_dob,a_age,a_gender,a_spo_score,a_score):
Student.__init__(self,a_name,a_dob,a_age,a_gender,a_score)
self.spo_score = a_spo_score
data5 = get_data('/home/aistudio/work/stu5.txt')
data6 = get_data('/home/aistudio/work/stu6.txt')
print("原始数据")
print(data5)
print(data6)
#Spostudent
stu_5 = Spostudent(data5.pop(0),data5.pop(0),data5.pop(0),data5.pop(0),data5.pop(0),data5)
print('姓名:%s,生日:%s,年龄:%s,性别:%s,分数:%s,特长分:%s' %(stu_5.name,stu_5.dob,stu_5.age,stu_5.gender,stu_5.top3(),stu_5.spo_score))
#Artstudent
stu_6 = Artstudent(data6.pop(0),data6.pop(0),data6.pop(0),data6.pop(0),data6.pop(0),data6)
print('姓名:%s,生日:%s,年龄:%s,性别:%s,分数:%s,特长分:%s' %(stu_6.name,stu_6.dob,stu_6.age,stu_6.gender,stu_6.top3(),stu_6.spo_score))
打印效果如下
合理利用函数,继承,可以让代码更加清晰简洁,避免了大量的代码重复,这种编程思想是很值得掌握的。