【阿尼亚喜欢BigData】“红亚杯”Python编程专题赛——满分解析⑤

大家好,喜欢Bigdata的阿尼亚来了!希望大家会喜欢阿尼亚的文章!!哇酷哇酷!!!

本次为师傅们带来的是“红亚杯”Python编程专题赛——满分解析系列的第⑤期,是“Python综合编程”篇章哦!

第①期完整赛题、第②期Python基础编程(1)、第③期Python基础编程(2)和第④期Python基础编程(3)的链接在下面,师傅们想看完整赛题、Python基础编程(1)、Python基础编程(2)、Python基础编程(3)的请安心享用:

【阿尼亚喜欢BigData】“红亚杯”Python编程专题赛——满分解析①_爱波吉的阿尼亚的博客-CSDN博客

【阿尼亚喜欢BigData】“红亚杯”Python编程专题赛——满分解析②_爱波吉的阿尼亚的博客-CSDN博客

【阿尼亚喜欢BigData】“红亚杯”Python编程专题赛——满分解析③_爱波吉的阿尼亚的博客-CSDN博客

【阿尼亚喜欢BigData】“红亚杯”Python编程专题赛——满分解析④_爱波吉的阿尼亚的博客-CSDN博客

目录

Python综合编程

九九乘法表

手机号分类

人民币大小写切换

查找关系密切的组合

根据身份证号计算退休年龄


Python综合编程

Python综合编程:主要是涉及Python综合应用能力,通过训练可以使学生根据实际工作中的问题,通过编程方式完成工作任务,共计5项综合任务。

环境中已安装python3.6.8,可使用python或python3即可查看;

环境中已经安装基础的依赖库,可使用pip list进行查看,也可自行下载;

推荐使用本地环境(选手电脑)上的VsCode ssh-remote插件连接主机;

九九乘法表

学习编程,循环是必备能力之一,本题需要使用while循环结构编写程序打印九九乘法表(正三角),请你按程序文件的注释,将Python代码补充完整。

要求如下:

代码保存地址为:/root/python2/form.py,补全代码;

使用占位符%对十进制整数进行结果格式化输出,要求整型占位符宽度为2,默认右对齐方式输出,使用end关键字在每个计算结尾处添加空格;

满足循环条件,则执行程序,更新变量循环参数,否则结束循环;

请你按程序文件的注释,将Python代码补充完整,运行程序,输出的结果。输出的结果形式如下:

1*1= 1    
1*2= 2 2*2= 4    
1*3= 3 2*3= 6 3*3= 9    
1*4= 4 2*4= 8 3*4=12 4*4=16  
1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25    
1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36    
1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49    
1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64    
1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81   

考核条件如下:

1. 编写程序,判断程序文件中是否涉及指定数据及知识点,验证程序结果是否正确。

操作环境: python

# -*- coding:utf-8 -*-
i=1
while i<10:
    j=1
    while j<=i:
        print("%d*%d=%2d"%(i,j,i*j),end=' ')
        j+=1
    print("")
    i+=1

手机号分类

项目背景:

某学校要统计所有学生手机号为哪些运营商的情况,手工统计非常耗时。请你按程序文件的注释,将Python代码补充完整,使用程序完成统计任务,运行程序并输出结果。

选手须知:

1.了解三大运营商的号段分布;

a)中国联通:130,131,132,155,156,185,186,145,176

b)中国移动:134, 135 , 136, 137, 138, 139, 147, 150, 151,152, 157, 158, 159, 178, 182, 183, 184, 187, 188

c)中国电信:133,153,189

2.判断手机号是否合法,依次按照长度(11位)、字符(只包含数字)、号段进行判断归类,若一个手机号长度和字符都不合法,按照顺序,需要将其划分到长度不合法里面;

3.判断手机号是否重复;

4.根据给定的学生信息进行手机号数据文件导入;

5.运行后输出格式为:移动数量为?个,联通数量为?个,电信数量为?个,长度不合法数量为?个,号段不合法数量为?个,字符不合法为?个。(英文字符)

6.代码保存地址为:/root/python2/phone.py,要求使用元素索引判定phone_prefix中号段是否合法;

7.数据文件地址为:/root/python_data/phone.txt

考核条件如下:

1. 编写程序,判断程序文件中是否涉及指定数据及知识点,验证程序结果是否正确。

操作环境: python

cm = 0   # 中国移动
cu = 0   # 中国联通
ct = 0   # 通过电信
lenerr = 0    # 长度不合法
preerr = 0    # 号段不合法
digiterr = 0  # 字符不合法

# 字段
phone_prefix = ['130','131','132','155','156','185','186','145','176','134','135','136','137','138','139','147','150','151','152','157','158','159','178','182','183','184','187','188','133','153','189']

with open('/root/python_data/phone.txt','r') as file:                  
    phone_list = file.readlines()           # 读取数据
plist=[]
for phone_num in phone_list: # 补充代码,确认手机号是否合法,依次判断长度,字符(纯数字),号段
    phone_num=phone_num.replace("\n","")
    if len(phone_num) != 11:
        lenerr += 1
    else:
        if phone_num.isnumeric():
            if (int(phone_num[:3])in phone_prefix[0:9]):
                if (phone_num not in plist):
                    pl.append(phone_num)
                    cu += 1
            elif (int(phone_num[:3])in phone_prefix[9:28]):
                if (phone_num not in plist):
                    pl.append(phone_num)
                    cm += 1
            elif (int(phone_num[:3])in phone_prefix[28:]):
                if (phone_num not in plist):
                    pl.append(phone_num)
                    ct += 1                
            else:
                preerr += 1
        else:
            digiterr += 1

print('移动数量为%d个,联通数量为%d个,电信数量为%d个,长度不合法数量为%d个,号段不合法数量为%d个,字符不合法为%d个.' % (cm, cu, ct,lenerr,preerr,digiterr))

人民币大小写切换

项目背景:

工作中常常需要报销差旅费等其他费用,但是由于报销单需要进行大小写规范,因此很多人进行大写数字书写时,常常需要进行资料查找。这里需要选手设计一个万位以内的数值大写转换(例如9999.99,最高为千位,最多两位小数),请你编写程序文件cnyswitch.py,运行程序,输入小写数值,返回对应的大写数字。

实例如下:

终端输入:python /root/python2/cnyswitch.py 1234.56

终端输出:壹仟贰佰叁拾肆圆伍角陆分

选手须知:

1.重点考核选手根据要求,自定义代码规则,创建函数满足对应功能;

2.中文金额数字大写分别为“壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、圆、角、分、零、整”。

3.按照数位顺序表,万以内数值转换,最高位为千位,数值最多包含两位小数(角、分)。

4.代码保存地址:/root/python2/cnyswitch.py

考核条件如下:

1. 编写程序,判断程序文件中是否涉及指定数据及知识点,验证程序结果是否正确。

操作环境: python

import sys
list = ['零','壹','贰','叁','肆','伍','陆','柒','捌','玖']
list_pos_a = ['圆','拾','佰','仟']
list_pos_b = ['分','角']
money = sys.argv[1]
money_Chinese = ''
temp = ''
if ("." not in money):
    if len(money)<=4:
        for value in range(len(money)):#每一次取出来一个value值,作为下标取出来汉字
            money_Chinese = money_Chinese + list[int(money[value])] + list_pos_a[int(len(money)-value-1)]
        print(money_Chinese+"整")
else:
    money_a=money.split('.')[0]
    money_b=money.split('.')[1]
    if len(money_a)<=4:
        for value in range(len(money_a)):#每一次取出来一个value值,作为下标取出来汉字
            money_Chinese = money_Chinese + list[int(money_a[value])] + list_pos_a[int(len(money_a)-value-1)]
    if len(money_b)<=2:
        for value in range(len(money_b)):#每一次取出来一个value值,作为下标取出来汉字
            money_Chinese = money_Chinese + list[int(money_b[value])] + list_pos_b[int(len(money_b)-value-1)]
        print(money_Chinese)

查找关系密切的组合

项目背景:

作为一个电影爱好者,常常会对电影相关信息进行分析,我们会发现很多演员会在不同的电影里进行合作,如果想要找出合作最为亲密的两个演员,手工查找分析是非常慢的,请你按程序文件的注释,将Python代码补充完整,从/root/python_data/film.xlsx中找出合作密切的两位演员,并用程序输出结果;

选手须知:

要了解频繁项集:经常一起出现的物品的集合。如果某个项集是频繁的,那么它的所有子集都是频繁的;如果某个项集不是频繁的,那么它的所有超集都不是频繁的。这一点是避免项集数量过多的重要基础,使得快速计算频繁项集成为可能。

1)代码文件地址为:/root/python2/film.py

2)数据文件地址为:/root/python_data/film.xlsx(注意文件是否正确,xlsx文件借助vscode上Excel Viewer进行查看,选中文件右键’open preview‘即可)

3)运行代码,结果输出实例如下:

终端输入: python /root/python2/film.py

终端输出:关系最好的2个演员是演员a,演员b,他们共同出演的电影数量是c.(其中标点符号使用英文)

备注:其中a,b,c为计算后的真实内容,这里仅做结果样式介绍。

考核条件如下:

1. 编写程序,判断程序文件中是否涉及指定数据及知识点,验证程序结果是否正确。

操作环境: python

import openpyxl
from  itertools import combinations
from functools import reduce 
from openpyxl import Workbook

def getData(filename):
    actors = dict()
    # 打开xlsx文件,并获取第一个worksheet
    wb = openpyxl.load_workbook(filename)
    ws = wb.worksheets[0]
    # 遍历Excel文件中的所有行
    for index, row in enumerate(ws.rows):
        if index==0:                # 绕过第一行的表头
            continue
        filmName, actor = row[0].value, row[2].value.split(' ')   # 获取电影名称和演员列表
        # 遍历该电影的所有演员,统计参演电影
        for a in actor:
            actors[a] = actors.get(a, set())
            actors[a].add(filmName)
    return actors

data = getData('/root/python_data/film.xlsx')        # 获取数据,代码中使用Excel数据

def relations(n):            # 查找关系最好的n个人
    allFilms = reduce(lambda x,y:x|y,data.values(),set())             # 全部电影合集
    combiData = combinations(data.items(),n)         # 关系最好的n个演员和参演的电影
    trueLove = max(combiData,key=lambda item: len(item[0][1] & item[1][1]))
    return("关系最好的2个演员是{0},{1},他们共同出演的电影数量是{2}".format(trueLove[0][0],trueLove[1][0],len(set(trueLove[0][1])&set(trueLove[1][1]))))               # 共同参演电影最多的n个演员

print(relations(2))         # 查找共同参演电影最多的2个演员

根据身份证号计算退休年龄

题目背景:

已知当前法定退休年龄为男性60周岁,女性55周岁,现要求根据某公司员工身份证信息进行年龄和退休时间统计,请你按程序文件的注释,将Python代码补充完整,实现年龄和退体时间的计算,运行代码,保存运行结果。结果中单条数据实例如下(字段为:姓名,身份证号,当前年龄,退休日期):

赵峰平 571115196702015183 54 2022-02-01

选手须知:

注意数据文件的读取。

日期时间对象和字符串之间的相互转换。

获取当前时间可以使用datetime.now()

字符串格式化与排版。

员工信息数据/root/python_data/staff.csv,数据字段为姓名、身份证号;

身份证号码是18位数,其中第7-10位是出生年份,第11-12位是出生月份,第13-14位是出生日,第17位是性别判断,奇数为男,偶数为女。

代码保存地址:/root/python2/retire.py

结果保存地址:/root/python_data/staffretire.txt,字段为姓名,身份证号,当前年龄,退休日期;

考核条件如下:

1. 编写程序,判断程序文件中是否涉及指定数据及知识点,验证程序结果是否正确。

操作环境: python
 

import  csv
from datetime import datetime ,date ,timedelta

staff_retire = open("/root/python_data/staffretire.txt", mode='a', encoding='utf-8')          # 结果保存文件

with open("/root/python_data/staff.csv",encoding="utf-8") as f:        # 数据文件
    reader = csv.reader(f)
    
    for index,row  in enumerate(reader):
            if index == 0:       #剔除首行表头
                continue
            else :
                Name,idCardNum = row[0], row[1]   # 获取姓名,身份证号

                for i in Name:
                    year=idCardNum[6:10]        # 年
                    month=idCardNum[10:12]        # 月份,不够两位前面补0
                    day=idCardNum[12:14]        # 日
                    birthday = year+"-"+month+"-"+day    # 出生年月日

                    birthday = datetime(int(year),int(month),int(day))    # 出生日期转换为日期时间对象
                    age = int(f'{datetime.now().year:04d}')-int(f'{birthday.year:04d}')                                         # 年龄为当前年份减去出生年份
                    if int(idCardNum[-2])%2 ==1:                    # 根据身份证倒数第二位进行性别判断,奇数为男,偶数为女
                        workYears=60
                    else:
                        workYears=55            
                    retirDate = birthday+timedelta(days=365*workYears)     #退休日期
                    retirDate = date(retirDate.year,birthday.month,birthday.day).strftime('%Y-%m-%d')
                staff_retire.write('{:<3} {:<18} {:<2} {:<10}\n'.format(row[0],row[1],age,retirDate))           # 输出格式为:姓名 身份证号 当前年龄 退休年月日(注意换行)
    staff_retire.close()

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱波吉的阿尼亚

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

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

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

打赏作者

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

抵扣说明:

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

余额充值