大学排名没有绝对的公正与权威,附件(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)
首先看一下第一个文件的内容:
我们下载文件,配置路径,一行一行的读取文件,并分割字符串:
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,即选择第一小问。输出在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,即选择第二小问。第二行输入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,即选择第三小问;第二行输入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,第二行输入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)