任务描述
本关任务:编写一个能进行大学排行榜分析的小程序。
相关知识
为了完成本关任务,你需要掌握:1.set()
函数。
set() 函数
描述 set()
函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
set
语法: class set([iterable])
参数说明:
iterable
-- 可迭代对象对象;
返回值 返回新的集合对象。
示例如下:
x = set('runoob')
y = set('google')
print(x) #重复的被删除
print(y) #重复的被删除
print(x&y) #返回一个新的集合,包括同时在集合 x 和y中的共同元素。
print(x|y) #返回一个新的集合,包括集合 x 和 y 中所有元素。
print(x^y) #返回一个新的集合,包括集合 x 和 y 的非共同元素。
print(x-y) #返回一个新的集合,包括在集合 x 中但不在集合 y 中的元素。
输出:
{'u', 'b', 'o', 'r', 'n'}
{'g', 'l', 'e', 'o'}
{'o'}
{'u', 'b', 'o', 'l', 'r', 'n', 'g', 'e'}
{'u', 'b', 'l', 'r', 'n', 'g', 'e'}
{'n', 'r', 'u', 'b'}
问题描述
题目
alumni.txt soft.txt 大学排名没有绝对的公正与权威,文件(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
编程要求
根据提示,在右侧编辑器补充代码,分析并输出相应的排名。
测试说明
平台会对你编写的代码进行测试:
测试输入:
1
10
预期输出:
两榜单中均名列前10的学校:
['上海交通大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学']
测试输入:
2
10
预期输出:
两榜单名列前10的所有学校:
['上海交通大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', ..........]
测试输入:
3
10
预期输出:
alumni中名列前10,soft中未进前10的学校:
['上海交通大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', ..........]
测试输入:
4
10
预期输出:
不同时出现在两个榜单前10的学校:
['上海交通大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', ..........]
def read_file(file,m):
"""读文件中的学校名到列表中,返回排名前m学校集合"""
########## Begin ##########
f = open(file, 'r',encoding='utf-8')
line1=[]
for i in range(m):
line=f.readline().strip("\n")
line1.append(line.split()[1])#把学校添加列表
return line1
########## End ##########
def either_in_top(alumni, soft):
"""接收两个排行榜前m高校名字集合,
获得在这两个排行榜中均名列前m的学校名,按照学校名称排序,
返回排序后的列表
"""
########## Begin ##########
list2 = []
for i in range(len(alumni)):
if alumni[i] in soft: # 如果同时在两个表中都有这个学校
list2.append(alumni[i])
list2.sort() # 升序排序
return list2
########## End ##########
def all_in_top(alumni, soft):
"""接收两个排行榜前m高校名字集合,
获得在两个榜单中名列前m的所有学校名,按照学校名称排序,
返回排序后的列表
"""
########## Begin ##########
list3 = []
list3.extend(alumni) # 列表合并alumni
list3.extend(soft) # 列表合并soft
list3 = list(set(list3)) # 列表去重
list3.sort() # 升序排序
return list3
########## End ##########
def only_alumni(alumni, soft):
"""接收两个排行榜前m高校名字集合,
获得在alumni榜单中名列前m但soft榜单中未进前m的学校名,
按照学校名称排序,返回排序后的列表
"""
########## Begin ##########
list4 = []
for i in range(len(alumni)):
if alumni[i] in soft:
continue
else:
list4.append(alumni[i]) # 如果在alumni榜单中名列前m
list4.sort() # 升序排序
return list4
########## End ##########
def only_once(alumni, soft):
"""接收两个排行榜前m高校名字集合,
获得在alumni和soft榜单中名列前m,但不同时出现在两个榜单的学校名,
按照学校名称排序,返回排序后的列表
"""
########## Begin ##########
list5 = []
for i in range(len(alumni)):
if alumni[i] in soft:
continue
else:
list5.append(alumni[i]) # 如果在alumni榜单中名列前m但soft榜单中未进前m的学校名
for i in range(len(soft)):
if soft[i] in alumni:
continue
else:
list5.append(soft[i]) # 如果在soft榜单中名列前m但alumni榜单中未进前m的学校名
list5.sort() # 升序排序
return list5
########## End ##########
def select_first(n):
"""
接收一个字符
判断这个字符是否属于 1234 中的一个字符,如果不是则输出 Wrong Option
如果是,则调用 select_again() 函数
"""
########## Begin ##########
if n in '1234':
select_again(n)
else:
print('Wrong Option')
########## End ##########
def select_again(n):
"""
接收一个字符
按左侧 任务要求->问题描述->输入输出 的规则判断 n ,并吊用上面定义的相应的函数
按左侧 任务要求->测试说明->预期输出 的样例进行输出
"""
m=int(input())
alumni_set = read_file('step1/alumni.txt',m)
soft_set = read_file('step1/soft.txt',m)
########## Begin ##########
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)
########## End ##########
if __name__ == '__main__':
n=input()
select_first(n)