• 【第十题详细解答】研一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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    二、分析

    (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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 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', '世界知名高水平大学']]
    
    • 1

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

    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    此时的输出结果为:

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

    改写成函数的形式为:

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    sort函数默认升序!

    最后的输出为:

    print(either_in_top(alumni_set, soft_set))
    
    • 1

    结果展示为:

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

    可以在平台上跑通!

    (2)第二小问

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

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

    extend() 函数
    
    • 1

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

    举一个简单的例子:

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

    我们的函数定义为:

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

    输出为:

    print(all_in_top(alumni_set, soft_set))
    
    • 1

    结果展示为:

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

    (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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    输出为:

    print(only_alumni(alumni_set, soft_set))
    
    • 1

    结果展示为:

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

    (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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    输出为:

    print(only_once(alumni_set, soft_set))
    
    • 1

    结果展示为:

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

    三、源代码

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
  • 相关阅读:
    随机数发生器设计(四)
    CSS篇八
    忘忧大陆-功能完备的社交项目整体介绍
    温湿度传感器原理介绍
    CICD 持续集成与持续交付——git
    PHP比较漏洞, 代码审计, 字符串数字, “0e“字符串, 布尔值比较, 极限值, switch比较, in_array比较
    杰理之修改不需要长按开机功能【篇】
    【无标题】
    arcgis pro批量修改多个矢量的属性
    【Flink】关于jvm元空间溢出,mysql binlog冲突的问题解决
  • 原文地址:https://blog.csdn.net/wzk4869/article/details/127753224