头歌python-实验八 大学排行榜分析

任务描述

本关任务:编写一个能进行大学排行榜分析的小程序。

相关知识

为了完成本关任务,你需要掌握:1.set() 函数。

set() 函数

描述 set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。

set 语法: class set([iterable])

参数说明:

  • iterable -- 可迭代对象对象;

返回值 返回新的集合对象。

示例如下:

 
  1. x = set('runoob')
  2. y = set('google')
  3. print(x) #重复的被删除
  4. print(y) #重复的被删除
  5. print(x&y) #返回一个新的集合,包括同时在集合 x 和y中的共同元素。
  6. print(x|y) #返回一个新的集合,包括集合 x 和 y 中所有元素。
  7. print(x^y) #返回一个新的集合,包括集合 x 和 y 的非共同元素。
  8. print(x-y) #返回一个新的集合,包括在集合 x 中但不在集合 y 中的元素。

输出:

 
  1. {'u', 'b', 'o', 'r', 'n'}
  2. {'g', 'l', 'e', 'o'}
  3. {'o'}
  4. {'u', 'b', 'o', 'l', 'r', 'n', 'g', 'e'}
  5. {'u', 'b', 'l', 'r', 'n', 'g', 'e'}
  6. {'n', 'r', 'u', 'b'}

问题描述

题目

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

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

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

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

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

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

编程要求

根据提示,在右侧编辑器补充代码,分析并输出相应的排名。

测试说明

平台会对你编写的代码进行测试:

测试输入:

 
  1. 1
  2. 10

预期输出:

 
  1. 两榜单中均名列前10的学校:
  2. ['上海交通大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学']

测试输入:

 
  1. 2
  2. 10

预期输出:

 
  1. 两榜单名列前10的所有学校:
  2. ['上海交通大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', ..........]

测试输入:

 
  1. 3
  2. 10

预期输出:

 
  1. alumni中名列前10,soft中未进前10的学校:
  2. ['上海交通大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', ..........]

测试输入:

 
  1. 4
  2. 10

预期输出:

 
  1. 不同时出现在两个榜单前10的学校:
  2. ['上海交通大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', '**大学', ..........]
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)

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python语言的LR语法分析实验是一项通过Python编程语言实现LR语法分析器的实验。LR语法分析是一种自底向上的语法分析方法,用于分析和验证程序中的语法结构。在实验中,我们可以利用Python语言的灵活性和易用性,编写LR语法分析器的代码,并对其进行测试和验证。 首先,我们需要定义和实现LR分析算法的各个步骤,包括状态转移的规则、LR(0)项集的构建、DFA的生成等。通过Python编程语言的高级特性和丰富的库函数,可以方便地实现这些算法,并且可以通过可视化工具将LR分析器的状态图形象地展现出来,有助于我们更直观地理解算法的执行过程。 其次,我们需要编写语法分析器的输入语法规则和待分析的程序代码。Python语言的简洁和易读性使得编写语法规则变得比较简单,同时也可以使用Python的工具来对待分析的程序代码进行预处理和文法分析,为后续的LR语法分析做准备。 最后,我们可以利用Python语言提供的测试框架对实现的LR语法分析器进行功能和性能测试。通过编写测试用例和使用Python的单元测试框架,可以全面地验证LR语法分析器的正确性和效率,并且可以通过性能分析工具对其性能进行评估和优化。 总的来说,通过Python语言进行LR语法分析实验可以让我们更深入地理解LR语法分析算法的原理和实现,同时也可以充分利用Python语言的优势来简化和优化实验过程,是一项非常有意义的实践活动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值