这两天在后台收到一些读者的留言,问我有没有字符串实战项目。字符串的实战项目,还要掌握Python的另外两种数据类型——列表和字典。今天给大家介绍两个关于Python基本数据类型的实战项目。1、字符串趣味实战题:1-20以内的数字替换,3的倍数和5的倍数用不同的数字替换。列出1到20的数字,如果是3的倍数,就换成apple,如果是5的倍数,就换成orange,如果是3和5的倍数,就换成appleorange。代码思路:第一种常见解法,循环1-20,然后用多个if/else判断:defreplace_num(i):ifi%3==0andi%5==0:return"banana"ifi%3==0:return'apple'ifi%5==0:return'orange'else:returnifforiinrange(1,20):print(replace_num(i))第二个很棒的解决方案:聪明的使用oflistslicing'apple'[i%3len('apple')::]+'orange'[i%5len('orange')::]ori先说一下这道题的解法,好像有是一片天外的天空,太神奇了!慢动作分解1:print('apple'[1::])>>'pple'表示从第二个位置开始切片慢动作分解2:既然明白了上面的内容,来个稍微复杂一点的>>print(为什么is'apple'[1*5::])为空,因为1*5为5,即从第6个字符开始,apple一共有5个字符,所以输出为空慢动作分解3:foriinrange(1,10):print('apple'[i%3::])>>pplepleapplepplepleapplepplepleapple会发现只有3的倍数才会出现完整的苹果,其他地方都是不完整的,但是我们怎么把非3的3的倍数变空的地方,简单的乘以一个偏移量,这个技巧对3的倍数没有影响,但是对其他非3的倍数影响很大。慢动作分解4:foriinrange(1,10):print('apple'[i%3*len('apple')::])>>appleappleapple虽然此时过滤掉了非3,但是我们要输出数字,怎么办呢?这里使用了一个非常聪明的orforiinrange(1,20):print('apple'[i%3*len('apple')::]ori)。这道题的技巧很高,也很巧妙,希望零基础的同学能认真看懂每一步!列表、词典——综合实践应用题目:找出全班名字最长的人。有一串名字:names=('KunpenJi,LiXIAO,CaronLi,DonlSHI,JiZHAO,FiaYUANY,WeueDING,XiuXU,HaiyingWANG,HaiLIN,JeyJIANG,JosonWANGE,AiyangZHANG,HayMENG,JakZHANGE,ChangZhang,CoroZHANG')需要满足以下三个要求:(1):排序,按姓名A-Z排序(2):找出姓“ZHANG”的人数(3):找出其中名字最长的人一长串,最后对列表进行排序(注意去掉名字前后多余的空格),第一个问题就解决了。defsort_names(names):return(sorted([name.strip()fornameinnames.split(',')]))分析题2:我们要找出姓“ZHANG”,因为有英文名字还有中文名字,有的后面是E/Y,所以我们先定义一个函数,从拆分出来的新名字列表中取出每一个名字,然后解析翻转,用推导列表形成新的名字列表,然后用字符字符串中的.startswitch('ZHANG')提取匹配的名称。defget_chinese_names(names):chinese_names=[]fornameinsort_names(names):iflen(name)>=2:first_name=name.split()[0].capitalize()last_name=name.split()[1.capitalize()chinese_names.append(last_name+''+first_name)else:chinese_names.append(name)list_temp=[]foriinchinese_names:ifi.startswith('Zhang'):list_temp.append(i)print("Thereare%speoplewiththesurname'ZHANG',whichare:%s"%(len(list_temp),list_temp))returnchinese_names分析题3:找出姓名中字符串最长的人,我们先定义一个函数,然后从问题1形成的新列表中取出每个名字,然后使用推导列表使用max方法提取匹配的名字。deflongest_name(names):long_names=[]fornameinsort_names(names):iflen(name)==max(len(name)fornameinsort_names(names)):long_names.append(name)print("名字最长的有%s个,分别是:%s"%(len(long_names),long_names))returnlong_names完整代码:names=('KunpenJi,LiXIAO,CaronLi,''DongjianSHI,JiZHAO,FiaYUANY,''WenxueDING,XuXU,HaiyingWANG,HaiLin,''JeyJIANG,JosonWANGE,''AiyangZHANG,HaiyingMENG,''JackZHANGE,ChangZhang,CoronZHANG')defsort_names(名称):names_list=sorted([name.strip()fornameinnames.split(',')])returnnames_listdefget_chinese_names(names):chinese_names=[]fornameinsort_names(names):iflen(name)>=2:first_name=name.split()[0].capitalize()last_name=name.split()[1].capitalize()chinese_names.append(last_name+''+first_name)else:chinese_names.append(name)list_temp=[]foriinchinese_names:ifi.startswith('张'):list_temp.append(i)print("姓'张'的有%s,分别为:%s"%(len(list_temp),list_temp))returnchinese_namesdeflongest_name(names):long_names=[]fornameinsort_names(names):iflen(name)==max(len(name)fornameinsort_names(names)):long_names.append(name)print("有%s个最长的名字,分别为:%s"%(len(long_names),long_names))returnlong_namesprint(sort_names(names))get_chinese_names(names)longest_name(names)今天给大家介绍的两个实战项目非常经典,希望初学Python的小伙伴们可以好好看看你们觉得实战项目怎么样?
