练习三 字符类型及其操作
本练习聚焦 Python 字符串各类实用处理操作,覆盖字符筛选、字符串删减、编码校验、生物序列统计、密码规则校验、文字数据统计、传统干支换算等场景。通过提取数字、去重连续字符、GS1 编码校验、DNA 碱基比对突变统计、密码合规判断、考勤文本统计、年份干支转换等题型,熟练掌握字符串遍历、切片、替换、计数、条件匹配、字符分类判断等核心操作,锻炼多行业场景下字符数据清洗与分析能力。
(I)提取数字字符
输入字符串x,将其中的数字字符('0'到'9')取出来,再逆向输出
例如 输入abc123def45gh123 输出32154321
输入123abab45 输出54321
提示:使用一个新的字符串变量保存提取的数字字符串
x=input("") #代码开始 digits = '' for c in x: if c.isdigit(): digits += c print(digits[::-1]) #代码结束(II)删除连续的字符
输入一个字符串,得到一个新字符串
将原字符串中出现连续的相同的字符,在新字符串中只留下一个字符
例如原字符串为abbbccdabc,新字符串为abcdabc
提示:
用一个新字符串存放删除重复字符后的新字符串
对原字符串遍历,将新字符串的最后一个字符与原字符比较,将不重复的字符连接到新的字符串
x=input() #代码开始 y='' for c in x: if not y or c!= y[-1]: y+=c #代码结束 print(y)(III)gs1 校验码计算
GS1码,即GS1全球商品标识
代码位置序号是指包括校验码在内的,由右至左的顺序号(校验码的代码位置序号为1)
从代码位置序号2开始,所有偶数位的数字代码求和。
将步骤1的和乘以3。
从代码位置序号3开始,所有奇数位的数字代码求和。
将步骤2与步骤3的结果相加。
用大于或等于步骤4所得结果且为10最小整数倍的数减去步骤4所得结果,其差即为所求校验码的值。
示例:代码690123456789X(X标识校验码)校验码的计算如下。
1.9+7+5+3+1+9=34
2.34*3=102
3.8+6+4+2+0+6=26
4.102+26=128
5.130-128=2
校验码=2
编写程序,输入12位编码,输出其校验码
输入
例如,输入234567892112输出6
输入690123456789输出2
s=input().strip() #代码开始 sum_even = 0 sum_odd = 0 for i in range(12): digit = int(s[i]) pos = 13-i if pos % 2 == 0: sum_even += digit else: if pos >= 3: sum_odd += digit step2 = sum_even * 3 total = step2 + sum_odd remain =total % 10 jym=0 if remain == 0: jym = 0 else: jym = 10 - remain #代码结束 print(jym)(IV)dna 的碱基统计
脱氧核糖核酸DNA,其中的核糖部分是脱氧核糖.
碱基有且仅有四种----腺嘌呤(A),胞嘧啶(C),鸟嘌呤(G)和胸腺嘧啶(T)。
输入一段DNA字符串,统计并输出ACTG的个数。
例如
输入AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC
输出
碱基A数量20
碱基C数量12
碱基T数量21
碱基G数量17
若输入的字符串中有其他字符,则显示输入错误
输入AGXTTTTYATTCTGACTGCAACGGGCAATATGTCTC
输出
输入错误
提示:可以设置flag变量来标志是否有错误输入
x=input("") #开始 count_a = 0 count_c = 0 count_g = 0 count_t = 0 flag = True for char in x: if char == 'A': count_a += 1 elif char == 'C': count_c += 1 elif char == 'G': count_g += 1 elif char == 'T': count_t += 1 else: flag = False break if not flag: print("输入错误") else: print(f"碱基A数量{count_a}") print(f"碱基C数量{count_c}") print(f"碱基T数量{count_t}") print(f"碱基G数量{count_g}") #结束(V)点突变个数
突变是核酸复制或合成时的错误,最简单的突变就是点突变。
给定两个相等长度的DNA字符串,要求计算点突变的数目。
输入
两相等长度的DNA字符串
输出
两个字符串相同位置字符不同的个数
若输入的字符串不等长或者包含除了ACTG外的其他字符,
输出
DNA错误
平台会对你编写的代码进行测试:
测试输入:
GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
预期输出:
7
测试输入:
BGAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
预期输出:
DNA错误
测试输入:
CATCGTAATGACGGCCT
CAGGG
预期输出:
DNA错误
s1=input() s2=input() #代码开始 valid_bases = {'A', 'C', 'G', 'T'} error_flag = False if len(s1) != len(s2): error_flag = True else: for char in s1: if char not in valid_bases: error_flag = True break if not error_flag: for char in s2: if char not in valid_bases: error_flag =True break if error_flag: print("DNA错误") else: count = 0 for a, b in zip(s1, s2): if a != b: count += 1 print(count) #代码结束(VI)密码有效性检测
小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求:
1.密码长度至少为8
2.密码只能由大写字母,小写字母,数字构成;
3.密码不能以数字开头;
编写程序,输入密码,若符合以上要求,显示合法密码,否则显示非法密码
例如,若输入12abcdefg,输出非法密码
输入abc12xyz,输出合法密码
输入a#c12xyz,输出非法密码
提示:
字符串方法isalpha()可以判断字符串是否为英文字母
isdigit()可以判断字符串是否为数字字符
可以设置flag变量的值来标识字符串是否合法
x=input() #开始 valid = True if len(x) < 8: valid = False if x[0].isdigit(): valid = False for char in x: if not (char.isupper() or char.islower() or char.isdigit()): valid = False break if valid: print("合法密码") else: print("非法密码") #结束(VII)考勤计算
某单位的考勤机输出一串字符串表示员工出勤状况
字符A表示正常,字符B表示迟到,字符C表示请假,字符D表示加班
该单位规定,正常上班奖励5元,迟到一次罚款10元,请假一次扣除50,加班一次奖励50
输入一串字符串,计算员工的奖金(有可能为负数)
例如AAABCDD,则显示金额55
例如ABBBCAAAAAA,则显示金额-45
x=input("") #代码开始 bonus = 0 for c in x: if c == 'A': bonus += 5 elif c == 'B': bonus -= 10 elif c == 'C': bonus -= 50 elif c == 'D': bonus += 50 print(f"金额{bonus}") #代码结束(VIII)年号干支的计算
在中国传统文化中,年份可以用天干地支来表示
转换方法如下:
天干=(年份-3)/10……余数一
地支=(年份-3)/12……余数二
余数一为1-9和0,按以下规则取天干
天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸
余数二为1-11和0,按以下规则取地支
地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥
例如2021年
(2021-3)/10……余数一为8 天干是辛
(2021-3)/12……余数二为2 地支是丑
所以为辛丑年
编写程序,输入年号,显示其天干地支
例如输入2020
输出庚子年
y=eval(input()) tgzf="癸甲乙丙丁戊己庚辛壬癸" dzzf="亥子丑寅卯辰巳午未申酉戌" #代码开始 tian_gan_index = (y % 10 - 3) % 10 di_zhi_index = (y % 12 - 3) % 12 tian_gan = tgzf[tian_gan_index] di_zhi = dzzf[di_zhi_index] print(f"{tian_gan}{di_zhi}年") #代码结束