知行编程网知行编程网  2022-02-26 09:00 知行编程网 隐藏边栏 |   抢沙发  2 
文章评分 0 次,平均分 0.0

前面讲了很多python的基础知识,有字符串列表,字典推导列表式,列了许多技巧和秘笈,但是东西太多不好记忆,而且不能灵活运用.

怎么办,东西多不好记,我独家整理了脑图,一张图搞定

不会灵活运用怎么办,我精选了2个非常典型的例子,包教包会

特别是第一个例子在任何书上都不到,让你眼前一亮,拍案叫绝,那我们下面就来看一下:

 

脑图

1.字符串技巧总览

字符串里面的东西特别多而且很杂,脑图是现在最流行也是最有效的记忆方法,我用脑图把这些知识总结,整理了,详细见下图独家干货:字符串,列表,字典-综合实战应用

这张图融合所以字符串应该掌握的知识点(特别是字符串格式化),基本上把这些招数全部掌握了一般的字符串处理都是小菜一碟.

 

2.列表用法总结:

独家干货:字符串,列表,字典-综合实战应用
列表是最常见也是最重要的Python数据结构,必须要熟悉掌握,这是基本功.

下面我们看看实战案例,来融汇一下吧.

 


 

实战

 

3.实战案例一:

列出1到20的数字,若是3的倍数就用apple代替,若是5的倍数就用orange代替,若既是3的倍数又是5的倍数就用appleorange代替。注意:只能用2行代码搞定

 

分析:

若是一般的思路,肯定是一个for循环,然后根据下标,进入一个if,else语句,判断i%3==0, 打印apple,i%5==0,打印orange,i%3==0 and i%5==0,打印appleorange,其他则输出i. 看起最少也要8,9行代码,2行怎么可能搞定呢~~

 

睁大眼睛看: 真的是2行搞定

答案:

独家干货:字符串,列表,字典-综合实战应用
>>

1

2

apple

4

orange

apple

7

8

apple

orange

11

apple

13

14

appleorange

16

17

apple

19

orange

 

深入解析:

  • 其实算法很简单,就是i对3和5取模,但是能2行搞定,精妙之处在于利用了字符串切片的一个特性
  • 比如apple[5::],结果为空,为什么,因为下标5的位置不存在,所以为空,那么apple[i%3*5],意味着i在1,2,3,4的时候取3的模,结果是1,2,0,1,然后用一个很巧妙的方法*5(5其实是apple的长度),做了一个偏移
  • 这样在3的整数的时候下面0*5=0,也就是从0开始取apple,而1,2,4的时候取3模是1,2,1,再乘以5就越界了所以取的apple为空.
  • 同理orange也是这样的,取5的模,然后*6(6是orange的长度)偏移
  • 最后用了一个or i ,先来说一下or, Python 对or 的判断是,print A or B ,若A为true,则结果为True,若A是false再判断B,B是true,则结果是True
  • print 'apple'[i%3*5::]+'orange'[i%5*6::] or i,表示当apple和orange偏移越界了就都为空的时候,就取i的值,是1,2,4,7...

 

4.实战案例二:

比如说我有一串字符串人名:names=' Kunpen Ji, Li XIAO, Caron Li, Donl SHI, Ji ZHAO, Fia YUAN Y, Weue DING, Xiu XU, Haiying WANG, Hai LIN, Jey JIANG, Joson WANG E, Aiyang ZHANG, Hay MENG, Jak ZHANG E, Chang Zhang, Coro ZHANG',我希望能做到下面3点

问题1:排序,按照名字A-Z排序

问题2:找出里面姓”ZHANG”有几个

问题3:找出名字里面最长的人

 

分析问题1:

首先我们要做的对字符串进行分割去掉','然后就变成了一个长的列表,然后对列表进行排序,第一个问题就解决了.

for index,n in enumerate(sorted(names.split(','))):

print index+1,n

 

分析问题2:

接下来,我们需要找出姓"ZHANG",因为名字里面有英文名字和中文名字,有的后面还跟E/Y,所以我们先定义一个函数,把分割后的新的名字列表,取出每一个名字,然后解析,翻转,用推导列表形成一个新的名字列表,然后再用字符串里的.startswith("ZHANG")取出符合的名字

def _change(text):

new_s1=text.split()[0:2]

reverse_s1=new_s1[::-1]

return ' '.join(reverse_s1)

new_names_lists=[_change(name) for name in names.split(',')]

names_with_ZHANG=[name for name in new_names_lists if name.startswith('ZHANG')]

print names_with_ZHANG

>>['ZHANG Aiyang', 'ZHANG Jak', 'ZHANG Coro']

 

分析问题3:

接下来,我们只要把名字和名字的长度,形成一个新的字典,名字:名字长度,然后就可以非常容易取到最大的人名了.

 

names_dict={name:len(name) for name in sorted(names.split(',')) }

print max(zip(names_dict.values(),names_dict.keys()))

>>(13, ' Joson WANG E')

 

 

好了实战案例就讲到这里啦,希望能给初学者一些启发,若有什么不懂的,也可以留言跟我探讨交流.马上过节,顺祝大家国庆快乐~~

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享