【第十题详细解答】研一Python基础课程第五周课后习题(含源代码)

一、题目

大学排名没有绝对的公正与权威,附件(alumni.txt, soft.txt)中为按照不同评价体系给出的国内大学前100名排行,对比两个排行榜单前m的学校的上榜情况,分析不同排行榜排名的差异。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

根据输入,输出以下内容:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

第一行输入1,第二行输入m,输出在alumni.txt和soft.txt榜单中均在前m个记录的大学,按照学校名称升序。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

第一行输入2,第二行输入m,输出在alumni.txt或者soft.txt榜单中前m个记录的所有大学,按照学校名称升序。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

第一行输入3,第二行输入m,输出出现在榜单alumni.txt中前m个记录但未出现在榜单soft.txt前m个记录中的大学,按照学校名称升序。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

第一行输入4,第二行输入m,输出没有同时出现在榜单alumni.txt前m个记录和榜单soft.txt前m个记录的大学,按照学校名称升序。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

第一行输入其他数据,则直接输出‘Wrong Option’

在这里插入图片描述
在这里插入图片描述
题目给定的代码框架为:

def read_file(file,m):
    """读文件中的学校名到列表中,返回前m个记录的学校集合"""
点击在此输入一行或多行代码

def either_in_top(alumni, soft):
    """接收两个排行榜前m高校名字集合,
    获得在这两个排行榜中均在前m个记录的学校名,按照学校名称排序,
    返回排序后的列表
    """
点击在此输入一行或多行代码



def all_in_top(alumni, soft):
    """接收两个排行榜前m高校名字集合,
    获得在两个榜单中名列前m的所有学校名,按照学校名称排序,
    返回排序后的列表
    """
点击在此输入一行或多行代码

def only_alumni(alumni, soft):
    """接收两个排行榜前m高校名字集合,
    获得在alumni榜单中名列前m但soft榜单中未进前m的学校名,
    按照学校名称排序,返回排序后的列表
    """
点击在此输入一行或多行代码

def only_once(alumni, soft):
    """接收两个排行榜前m高校名字集合,
    获得在alumni和soft榜单中名列前m,但不同时出现在两个榜单的学校名,
    按照学校名称排序,返回排序后的列表
    """
点击在此输入一行或多行代码


def judge(n):
    if n in '1234':
        m=int(input())
        alumni_set = read_file('./alumni.txt',m)
        soft_set = read_file('./soft.txt',m)
        if n=='1':
            either_rank = either_in_top(alumni_set, soft_set)
            print(f'两榜单中均名列前{m}的学校:')
            print(either_rank)
        elif n=='2':
            all_rank = all_in_top(alumni_set, soft_set)
            print(f'两榜单名列前{m}的所有学校:')
            print(all_rank)
        elif n=='3':
            only_in_alumni_rank = only_alumni(alumni_set, soft_set)
            print(f'alumni中名列前{m},soft中未进前{m}的学校:')
            print(only_in_alumni_rank)
        elif n=='4':
            alumni_soft_rank = only_once(alumni_set, soft_set)
            print(f'不同时出现在两个榜单前{m}的学校:')
            print(alumni_soft_rank)
    else:
        print('Wrong Option')
        

if __name__ == '__main__':
    num = input()
    judge(num)

二、分析

(0)读取文件

首先看一下第一个文件的内容:

在这里插入图片描述

我们下载文件,配置路径,一行一行的读取文件,并分割字符串:

path = './24.研一周五六七节Python作业/alumni.txt'
def read_file(file, m):
    f = open(file = path, encoding = 'utf-8')
    lst = []
    for i in range(m):
        line = f.readline().strip('\n')
        lst.append(line.split())
    return lst

print(read_file(path, 10))

我们看一下输出结果:

[['1', '北京大学', '北京', '100', '8', '世界一流大学'], ['2', '清华大学', '北京', '98.78', '8', '世界一流大学'], ['3', '复旦大学', '上海', '82.14', '8', '世界一流大学'], ['4', '浙江大学', '浙江', '81.98', '8', '世界一流大学'], ['5', '南京大学', '江苏', '81.43', '8', '世界一流大学'], ['6', '上海交通大学', '上海', '81.34', '8', '世界一流大学'], ['7', '华中科技大学', '湖北', '80.49', '7', '世界知名高水平大学'], ['8', '中国科学技术大学', '安徽', '80.44', '8', '世界一流大学'], ['9', '中国人民大学', '北京', '80.41', '8', '世界一流大学'], ['10', '天津大学', '天津', '80.38', '7', '世界知名高水平大学']]

可以看到,此时的输出结果里面,文件的每一行都是一个列表,我们只需要学校的名字,因此切片即可:

path = './24.研一周五六七节Python作业/alumni.txt'
def read_file(file, m):
    f = open(file = path, encoding = 'utf-8')
    lst = []
    for i in range(m):
        line = f.readline().strip('\n')
        lst.append(line.split()[1])
    return lst

print(read_file(path, 10))

此时的输出结果为:

(base) D:\Code Project>D:/Anaconda/python.exe "d:/Code Project/24.研一周五六七节Python作业/demo.py"
['北京大学', '清华大学', '复旦大学', '浙江大学', '南京大学', '上海交通大学', '华中科技大学', '中国科学技术大学', '中国人民大学', '天津大学']

改写成函数的形式为:

def read_file(file, m):
    """读文件中的学校名到列表中,返回前m个记录的学校集合"""
    f = open(file, encoding='utf-8')
    lst = []
    for i in range(m):
        line = f.readline().strip("\n")
        lst.append(line.split()[1])
    return lst

(1)第一小问

第一个参数输入为1,即选择第一小问。输出在alumni.txt和soft.txt榜单中均在前m个记录的大学,按照学校名称升序。

先看一下soft文件:

在这里插入图片描述

我们的思路是,先创建一个空列表,然后遍历第一个文件,判断每一个学校名是否在第二个文件里面,如果在,就append到列表中。

我们的函数为:

def either_in_top(alumni, soft):
    """接收两个排行榜前m高校名字集合,
    获得在这两个排行榜中均在前m个记录的学校名,按照学校名称排序,
    返回排序后的列表
    """
    lst = []
    m = len(alumni)
    for i in range(m):
        if alumni[i] in soft: # 如果同时在两个表中都有这个学校
            lst.append(alumni[i])
    lst.sort()  #升序排序
    return lst

sort函数默认升序!

最后的输出为:

print(either_in_top(alumni_set, soft_set))

结果展示为:

(base) D:\Code Project>D:/Anaconda/python.exe "d:/Code Project/24.研一周五六七节Python作业/demo.py"
['上海交通大学', '中国科学技术大学', '北京大学', '华中科技大学', '南京大学', '复旦大学', '浙江大学', '清华大学']

可以在平台上跑通!

(2)第二小问

第一个参数输入为2,即选择第二小问。第二行输入m,输出在alumni.txt或者soft.txt榜单中前m个记录的所有大学,按照学校名称升序。

我们需要输出两个文件中所有排名前m的学校名称,我们引入extend函数:

extend() 函数

用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。

举一个简单的例子:

a = [1,2 ,3]
a.extend(range(3))
print(a)
# 输出结果:
[1, 2, 3, 0, 1, 2]

我们的函数定义为:

def all_in_top(alumni, soft):
    """接收两个排行榜前m高校名字集合,
    获得在两个榜单中名列前m的所有学校名,按照学校名称排序,
    返回排序后的列表
    """
    lst = []
    lst.extend(alumni) # 合并
    lst.extend(soft)
    lst = list(set(lst)) # 去重
    lst.sort()
    return lst

输出为:

print(all_in_top(alumni_set, soft_set))

结果展示为:

(base) D:\Code Project>D:/Anaconda/python.exe "d:/Code Project/24.研一周五六七节Python作业/demo.py"
['上海交通大学', '中国人民大学', '中国科学技术大学', '中山大学', '北京大学', '华中科技大学', '南京大学', '复旦大学', '天津大学', '武汉大学', '浙江大学', '清华大学']

(3)第三小问

第一个参数输入为3,即选择第三小问;第二行输入m,输出出现在榜单alumni.txt中前m个记录但未出现在榜单soft.txt前m个记录中的大学,按照学校名称升序。

思路和第小问很类似,同样有序遍历第一个文件,获得在alumni榜单中名列前m但soft榜单中未进前m的学校名。

函数如下:

def only_alumni(alumni, soft):
    """接收两个排行榜前m高校名字集合,
    获得在alumni榜单中名列前m但soft榜单中未进前m的学校名,
    按照学校名称排序,返回排序后的列表
    """
    lst = []
    m = len(alumni)
    for i in range(m):
        if alumni[i] in soft:
            continue
        else:
            lst.append(alumni[i])
    lst.sort()
    return lst

输出为:

print(only_alumni(alumni_set, soft_set))

结果展示为:

(base) D:\Code Project>D:/Anaconda/python.exe "d:/Code Project/24.研一周五六七节Python作业/demo.py"
['中国人民大学', '天津大学']

(4)第四小问

第一行输入4,第二行输入m,输出没有同时出现在榜单alumni.txt前m个记录和榜单soft.txt前m个记录的大学,按照学校名称升序。

思想很简单,遍历第一个文件和第二个文件。在遍历第一个文件时,在第一个文件而不在第二个文件的学校名称加入列表中;同理可得,在遍历第二个文件的时候,在第二个文件里面而不在第一个文件里面的学校名称添加到列表中。

函数如下所示:

def only_once(alumni, soft):
    """接收两个排行榜前m高校名字集合,
    获得在alumni和soft榜单中名列前m,但不同时出现在两个榜单的学校名,
    按照学校名称排序,返回排序后的列表
    """
    lst = []
    m = len(alumni)
    n = len(soft)
    for i in range(m): 
        if alumni[i] in soft:
            continue
        else:
            lst.append(alumni[i])
    for i in range(n):
        if soft[i] in alumni:
            continue
        else:
            lst.append(soft[i])
    lst.sort()
    return lst

输出为:

print(only_once(alumni_set, soft_set))

结果展示为:

(base) D:\Code Project>D:/Anaconda/python.exe "d:/Code Project/24.研一周五六七节Python作业/demo.py"
['中国人民大学', '中山大学', '天津大学', '武汉大学']

三、源代码

def read_file(file, m):
    """读文件中的学校名到列表中,返回前m个记录的学校集合"""
    f = open(file, encoding='utf-8')
    lst = []
    for i in range(m):
        line = f.readline().strip("\n")
        lst.append(line.split()[1])
    return lst


def either_in_top(alumni, soft):
    """接收两个排行榜前m高校名字集合,
    获得在这两个排行榜中均在前m个记录的学校名,按照学校名称排序,
    返回排序后的列表
    """
    lst = []
    m = len(alumni)
    for i in range(m):
        if alumni[i] in soft: # 如果同时在两个表中都有这个学校
            lst.append(alumni[i])
    lst.sort()  #升序排序
    return lst


def all_in_top(alumni, soft):
    """接收两个排行榜前m高校名字集合,
    获得在两个榜单中名列前m的所有学校名,按照学校名称排序,
    返回排序后的列表
    """
    lst = []
    lst.extend(alumni) # 合并
    lst.extend(soft)
    lst = list(set(lst)) # 去重
    lst.sort()
    return lst


def only_alumni(alumni, soft):
    """接收两个排行榜前m高校名字集合,
    获得在alumni榜单中名列前m但soft榜单中未进前m的学校名,
    按照学校名称排序,返回排序后的列表
    """
    lst = []
    m = len(alumni)
    for i in range(m):
        if alumni[i] in soft:
            continue
        else:
            lst.append(alumni[i])
    lst.sort()
    return lst


def only_once(alumni, soft):
    """接收两个排行榜前m高校名字集合,
    获得在alumni和soft榜单中名列前m,但不同时出现在两个榜单的学校名,
    按照学校名称排序,返回排序后的列表
    """
    lst = []
    m = len(alumni)
    n = len(soft)
    for i in range(m): 
        if alumni[i] in soft:
            continue
        else:
            lst.append(alumni[i])
    for i in range(n):
        if soft[i] in alumni:
            continue
        else:
            lst.append(soft[i])
    lst.sort()
    return lst


def judge(n):
    if n in '1234':
        m=int(input())
        alumni_set = read_file('./24.研一周五六七节Python作业/alumni.txt',m)
        soft_set = read_file('./24.研一周五六七节Python作业/soft.txt',m)
        if n=='1':
            either_rank = either_in_top(alumni_set, soft_set)
            print(f'两榜单中均名列前{m}的学校:')
            print(either_rank)
        elif n=='2':
            all_rank = all_in_top(alumni_set, soft_set)
            print(f'两榜单名列前{m}的所有学校:')
            print(all_rank)
        elif n=='3':
            only_in_alumni_rank = only_alumni(alumni_set, soft_set)
            print(f'alumni中名列前{m},soft中未进前{m}的学校:')
            print(only_in_alumni_rank)
        elif n=='4':
            alumni_soft_rank = only_once(alumni_set, soft_set)
            print(f'不同时出现在两个榜单前{m}的学校:')
            print(alumni_soft_rank)
    else:
        print('Wrong Option')
        
if __name__ == '__main__':
    num = input()
    judge(num)
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旅途中的宽~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值