python基础编程 统计英语文章词频并排序 文本操作 继承

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))

打印效果如下
在这里插入图片描述

合理利用函数,继承,可以让代码更加清晰简洁,避免了大量的代码重复,这种编程思想是很值得掌握的。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值