研一Python基础课程第五周课后习题分享(含源代码)

写在前面的话

这次的作业写的比较快和赶。因为后面几天的安排比较忙,没有充分的时间去考虑代码的美观,所以有问题的同学,欢迎大家批评指正!

注意:有些之前犯的错误和相关解释放在代码注释里!

在这里插入图片描述

一、题目分享

1. 第一题

在这里插入图片描述

2. 第二题

在这里插入图片描述

3. 第三题

在这里插入图片描述

4. 第四题

在这里插入图片描述

5. 第五题

在这里插入图片描述

6. 第六题

在这里插入图片描述

7. 第七题

在这里插入图片描述

8. 第八题

在这里插入图片描述

9. 第九题

在这里插入图片描述

10. 第十题

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

大学排名没有绝对的公正与权威,附件(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 problem_1():
    s = '''
    "Collusion is very real with Russia," Trump quoted conservative commentator Dan Bongino as saying on Trump's favorite Fox News morning show, "but only with Hillary and the Democrats, and we should demand a full investigation."
    '''
    counts = 0
    for i in range(len(s)):
        if s[i] == ' ' or s[i] == ', ' or s[i] == '.':
            counts += 1
    print(counts)


def problem_2():
    """
    任意累积
    """
    # 第一次便理解错了输入的含义,以为是输入一个字符串,打错特错的想法!
    """
    def cmul(inp):
        inp = inp.split(',')
        a_0 = int(inp[0])
        for i in range(1, len(inp) - 1):
            a_0 *= int(inp[i])
        a_0 *= int(inp[len(inp) - 1][0])
        return a_0
    print(eval("cmul({})".format(input())))
    """
    def cmul(a,*inp):
        # a从元组的第一个数据开始,比如元组为(1,2,3,4)那么a就是1,如果是(4,3,2,1),那么a就是4
        for i in inp:
            a *= i
        return a
    print(eval("cmul({})".format(input())))


def problem_3():
    """
    补充编程模板中代码,完成如下功能:
    以整数 17 为随机数种子,获取用户输入整数N为长度,产生 3 个长度为N位的密码,密码的每位是一个数字。每个密码单独一行输出。
    产生密码采用random.randint()函数
    """
    # 第一次尝试的代码,与输出结果不同,原因在于我是一次选择生成了9个随机整数,此题不通!引以为戒!
    """
    import random
    def genpwd(length):
        pass_world = ''
        for i in range(length):
            s = random.randint(1, 9)
            pass_world += str(s)
        return pass_world

    length = eval(input())
    random.seed(17)
    for i in range(3):
        print(genpwd(length))
    """
    import random
    def genpwd(length):
        a = 10 ** (length - 1)
        b = 10 ** length - 1
        final = '{}'.format(random.randint(a, b))
        return final
    length = eval(input())
    random.seed(17)
    for i in range(3):
        print(genpwd(length))


def problem_4():
    import time
    timestr = "2020-10-10 10:10:10"
    t = time.strptime(timestr, "%Y-%m-%d %H:%M:%S")
    print(time.strftime("%Y年%m月%d日%H时%M分%S秒", t))


def problem_5():
    from datetime import datetime
    import time
    day_1, day_2 = input().split(',')
    day_1 = time.strptime(day_1, "%Y年%m月%d日%H点%M分%S秒")
    day_2 = time.strptime(day_2, "%Y年%m月%d日%H点%M分%S秒")
    # 转换时间日期的结构
    d_1 = datetime(day_1[0], day_1[1], day_1[2], day_1[3], day_1[4], day_1[5])
    d_2 = datetime(day_2[0], day_2[1], day_2[2], day_2[3], day_2[4], day_2[5])
    days = (d_2 - d_1).days
    print(days)
    # 从前往后减的话,需要加abs()函数,并且还要减去1


def problem_6():
    """
    阶乘累加求和
    """
    import math 
    sum = 0
    n = eval(input())
    for i in range(1, n + 1):
        sum += math.factorial(i)
    print(sum)


def problem_7():
    """
    求斐波纳契(Fibonacci)数列:1, 1, 2, 3, 5, 8... 的前n项值
    """
    # 这里还有很大的优化空间,最后一步的输出中,如果用end = ',',最后一个数据后也有',',所以选择了if语句进行判断
    n = eval(input())
    def f(n):
        if n == 2 or n == 1:
            return 1
        return f(n - 2) + f(n - 1)
    for i in range(1, n + 1):
        if i < n:
            print(f(i), end = ',')
        else:
            print(f(i))


def problem_8():
    n = eval(input())
    if n % 2 == 1:
        sum = 0
        for i in range(1, n + 1, 2):
            sum += 1 / i
    elif n % 2 == 0:
        sum = 0
        for i in range(2, n + 1, 2):
            sum += 1 / i
    print('%.2f'%sum)


def problem_9():
    """
    猴子第一天摘下若干个桃子,立即吃了一半,还不过瘾又多吃了一个
    第二天将第一天剩下的桃子吃了一半又多吃了一个
    以后每天以这个规律吃下去,到第十天再去吃时发现只剩下一个桃子,问猴子第一天摘了多少个桃子?
    """

    def peach(n):
        if n == 10:
            return 1
        elif n < 10:
            return (peach(n + 1) + 1) * 2

    for i in range(10, 0, -1):
        print("第{}天有{}只桃子".format(i,peach(i)))


def probelm_10():

    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)
        

if __name__ == '__main__':
    probelm_10()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

旅途中的宽~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值