个人技术分享

第1关:个人数据脱敏

任务描述

随着计算机与互联网技术快速发展,电话号码,家庭住址,姓名等个人隐私信息被泄露的风险也越来越高。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

数据脱敏是指对敏感信息进行变形处理,比如将电话号码 13000000000 中的四位用*来代替,变为 130****0000

本题要求从输入的学生信息中将手机号码,姓名,学号数据进行脱敏处理。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

处理规则如下:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

学号(13 位或 14 位数串):第 5-11 位修改为*0121134567801 修改为 0121*******01

姓名:第2位修改为*,如贾诩修改为贾*

电话号码(11位数串):第4-7位修改为*13000000000中修改为130****0000

输入格式‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

第一行输入 n,代表 n 个同学的信息‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

依次输入 n 行学生信息数据,每行输入一名学生的学号、姓名、电话号码,数据间以空格间隔

输出格式‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

将学生数据脱敏后的信息保存到二维列表中,并输出这个二维表。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

如果 n 不是正整数,输出ERROR。(本题保证 n 是整数,且信息完整)

示例 1‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输入: 2 01211345678011 张辽 14457673508 01211345678012 徐晃 18514863218 输出:
[['0121*******011', '张*', '144****3508'], ['0121*******012', '徐*', '185****3218']]

def DataMasking():
    mask = [input().split() for i in range(n)]
    for item in mask:
        item[0] = item[0][:4] +  '*' * 7 + item[0][11:]
        item[1] = item[1][0] + '*' + item[1][2:]
        item[2] = item[2][:3] + '*' * 4 + item[2][7:]
    return mask
 
if __name__ == '__main__':
    n = int(input())
    print('ERROR') if n <= 0 else print(DataMasking())

第2关:年龄最大的人

任务描述

给定一批人的出生日期,请找出其中年龄最大的,并输出他的出生日期。(同年同月同日出生的人才一样大)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

日期格式为yyyy-mm-dd:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

四位数 y 表示年份(不小于1000);‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

两位数 m 表示月份;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

两位数 d 表示日期;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

年、月、日之间以一个连字符-分隔。

输入:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

每行输入一个日期,输入回车时结束输入 提示:判断输入是否为空字符串,为真则结束输入 本题保证所有输入均为标准格式yyyy-mm-dd

输出:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输出最大的人的出生日期,格式同输入。

输入输出示例

输入: 2008-08-08 1953-06-15 1949-10-01 1926-08-18

输出: 1926-08-18

ls=[]
while 1:
    x = input()
    if x=='':
        break
    ls.append(x)
ls.sort()
print(ls[0])

第3关:绝对值排序

任务描述

读入一个列表,按照绝对值从大到小排序,如果绝对值相同,则正数在前面。

提示:使用list1=eval(input())直接读入一个列表。

输入格式‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

题目的输入为一行,是一个元素类型都是数值的列表, 如:[3,-4,2,4]

输出格式‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输出为一行,是按照绝对值从大到小排序后的列表里的元素,元素之间用一个英文半角逗号分隔,如: 4,-4,3,2

示例1‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输入:[3,-4,2,4] 输出:4,-4,3,2

示例2‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输入:[5.2,3,4,6,-5.2]
输出:6,5.2,-5.2,4,3

ls = eval(input())
ls.sort(key=lambda x:(abs(x),x),reverse=True)
print(','.join(map(str,ls)))

第4关:奇偶插入

任务描述

给定一个无序的列表A,其中数据均为非负整数,其中奇数和偶数各占一半。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

当列表A中的奇数和偶数个数相同时,将A中的奇数和偶数分别排序,并在放入列表时保持:当i是奇数时,A[i]为奇数,i为偶数时,A[i]为偶数‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

如果输入的数据不符合本题要求,输出ERROR

本题不考虑内存限制,可使用多个列表完成操作。

示例 1‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输入: 4 5 7 2

输出: [2, 5, 4, 7]

示例 2‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输入: 1 2 3

输出: ERROR

l=input().strip().split(" ")
l=list(map(int,l))
l.sort()
l1=[i for i in l if i%2==1]#l1存放奇数
l2=[i for i in l if i%2==0]#l1存放偶数
if len(l1)==len(l2):
    l=[]
    for i in range(len(l1)):
        l.append(l2[i])
        l.append(l1[i])
    print(l)
else:
    print("ERROR")

第5关:程序员问卷调查

  • 任务描述

题目文件中保存来自约60000条程序员的问卷调查记录(部分数据),数据来源:2020 Stack Overflow Developer Survey‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

调查问题为:

图片

文件中数据格式为:

图片

每行数据分为两部分,调查编号和工作描述 题目提供一个fopen函数打开该文件,将数据存入列表并返回。

 
  1. #不允许修改。fopen函数打开文件,并返回包含文件数据一个列表ls,
  2. def fopen(name):
  3. ls=[]
  4. with open(name,'r',encoding = 'UTF-8') as f:
  5. for i in f.readlines()[1:]:
  6. ls.append(i.strip().split(',', maxsplit=1))
  7. return ls
  8. lt = fopen('survey.csv') #不允许修改,打开题目文件,并将返回的数据列表赋值给lt

返回列表形式为(仅展示格式,与数据无关): [['1', 'I am a developer by profession'], ['2', 'I am a developer by profession'], ['3', 'I code primarily as a hobby'], ['4', 'I am a developer by profession'], ['5', '"I used to be a developer by profession, but no longer am"'], ... ...]

请输入下列分类,统计问卷数据中下列各项分类的回答记录条数:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

分类 回答
程序员 I am a developer by profession
程序爱好者 I code primarily as a hobby
程序初学者 I am a student who is learning to code
编程相关者 "I am not primarily a developer, but I write code sometimes as part of my work"
非程序员 "I used to be a developer by profession, but no longer am"
空白 NA

如果输入为记录,输出所有记录条数‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬ 如果不是以上的输入,则输出错误输入

输入输出示例‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输入输出示例仅为格式示例,与实际测试数据无关

输入 输出
示例 1 成员 错误输入
示例 2 程序爱好者 程序爱好者:23457条
示例 3 记录 总计:66887条
示例 4 空白 空白:4567条

#不允许修改。fopen函数打开文件,并返回包含文件数据一个列表ls,
def fopen(name):
    ls=[]
    with open(name,'r',encoding = 'UTF-8') as f:
       for i in f.readlines()[1:]:
           ls.append(i.strip().split(',',maxsplit=1))
    return ls

lt = fopen('step7/survey.csv')   #不允许修改,打开题目文件,并将返回的数据列表赋值给lt
 
def fun(ls):
    person_no_hair=0
    like_no_hair=0
    new_no_hair=0
    rele_no_hair=0
    no_no_hair=0
    kong=0
    for i in ls:
        if i[1]=='I am a developer by profession':#程序员
            person_no_hair+=1
        elif i[1]=='I code primarily as a hobby':#程序爱好者
            like_no_hair+=1
        elif i[1]=='I am a student who is learning to code':#程序初学者
            new_no_hair+=1
        elif i[1]=='"I am not primarily a developer, but I write code sometimes as part of my work"':#编程相关者
            rele_no_hair+=1
        elif i[1]=='"I used to be a developer by profession, but no longer am"':#非程序员
            no_no_hair+=1
        elif i[1]=='NA':
            kong+=1
    return [person_no_hair, like_no_hair, new_no_hair, rele_no_hair, no_no_hair,kong]

s=input()
l=fun(lt)
if(s=='程序员'):
    print(f"程序员:{l[0]}条")
elif(s=='程序爱好者'):
    print(f"程序爱好者:{l[1]}条")
elif(s=='程序初学者'):
    print(f"程序初学者:{l[2]}条")
elif(s=='编程相关者'):
    print(f"编程相关者:{l[3]}条")
elif(s=='非程序员'):
    print(f"非程序员:{l[4]}条")
elif(s=='空白'):
    print(f"空白:{l[5]}条")
elif(s=='记录'):
    print(f"总计:{sum(l)}条")
else:
    print("错误输入")

 

第6关:2024政府工作报告数据提取

任务描述

附件中为2024年政府工作报告,本题要求将报告中所有包含数字字符的短句(*)进行提取。

  • 短句:将中文标点符号替换为英文空格,然后将报告数据按英文空格进行分割得到的列表中的字符串。
 
    
  1. ['"', '#', '$', '%', '&', ''', '(', ')', '*', '+', ',', '-', '/', ':', ';', '<', '=', '>', '@', '[', '\', ']', '^', '_', '`', '{', '|', '}', '~', '⦅', '⦆', '「', '」', '、', '\u3000', '、', '〃', '〈', '〉', '《', '》', '「', '」', '『', '』', '【', '】', '〔', '〕', '〖', '〗', '〘', '〙', '〚', '〛', '〜', '〝', '〞', '〟', '〰', '〾', '〿', '–', '—', '‘', '’', '‛', '“', '”', '„', '‟', '…', '‧', '﹏', '﹑', '﹔', '·', '.', '!', '?', '。', '。']
  2. # 本题使用上述中文标点符号集

编程要求

代码模板已将文件内容读取为一个字符串。

输入一个关键词key

  1. 如果该关键词key在报告中出现,则统计输出该关键字key在报告中出现的次数,并按照报告中出现顺序依次输出包含该关键词key所有短句,以换行间隔。
  2. 如果输入的关键词为数字短句,则输出所有包含数字的短句,以换行间隔。
  3. 除以上情况外如果输入的关键词在报告中没有出现过,则输出 未找到关键词

提示:本题可使用列表推导式将满足要求的短句放入列表,再做后续处理。

测试说明

  1. 根据关键词查询的结果,必须按照报告中出现顺序输出。
  2. 2024政府工作报告

格式示例:

输入1: 卫生

输出1: 5 医药卫生 提高医疗卫生服务能力 扩大基层医疗卫生机构慢性病 精神卫生 深入开展健康中国行动和爱国卫生运动

输入2: 数字短句

输出2:(要求输出所有数字短句,此示例仅展示部分数据) 2024年3月5日在第十四届全国人民代表大会第二次会议上 2023年工作回顾 国内生产总值超过126万亿元 增长5.2% ... ...

输入3: 湖北

输出3: 未找到关键词

import string

def Read_report(name):  #本函数已定义完整
    #读取报告原文,返回字符串,本函数勿修改。
    with open(name,'r',encoding='UTF-8') as f:
        return f.read()


#下方为待完成区域
def Short(s):  
    #定义函数,判断字符串s中是否包含数字字符
    for n in '0123456789':
        if n in s:
            return True
    return False

def Sign_delete(s):  
    #定义函数,将报告字符串中的所有中文标点符号替换成英文空格,以便后续分割列表。
    sign = ['"', '#', '$', '%', '&', ''', '(', ')', '*', '+', ',', '-', '/', ':', ';', '<', '=', '>', '@', '[', '\', ']', '^', '_', '`', '{', '|', '}', '~', '⦅', '⦆', '「', '」', '、', '\u3000', '、', '〃', '〈', '〉', '《', '》', '「', '」', '『', '』', '【', '】', '〔', '〕', '〖', '〗', '〘', '〙', '〚', '〛', '〜', '〝', '〞', '〟', '〰', '〾', '〿', '–', '—', '‘', '’', '‛', '“', '”', '„', '‟', '…', '‧', '﹏', '﹑', '﹔', '·', '.', '!', '?', '。', '。']
    # 继续完成函数定义
    for c in sign:
        s=s.replace(c,' ')
    return s.split()

def Search(key):
    ls=[x for x in report if key in x]
    if len(ls)==0:
        print('未找到关键词')
    else:
        print(len(ls))
        for x in ls:
            print(x)



name = 'step8/2024政府工作报告.txt'
report  = Read_report(name)   #读取报告文件
report  = Sign_delete(report) #替换报告中符号,以便后续分隔
key = input()  #输入关键词
# 下方继续后续流程设计代码
if key=='数字短句':
    for x in report:
        if Short(x):
            print(x)
else:
        Search(key)