![](https://img.haomeiwen.com/i3256786/8f61de973a3ee444.png)
这是菜鸟学Python的第108篇原创文章
阅读本文大概需要2分钟
目前累计已经写了100多篇,写了小白入门篇,爬虫数据库篇,以及数据可视化分析.洋洋洒洒,越写越多.下一个阶段我准备开始写机器学习,文本分析.而文本分析里面有一个非常重要技巧就是字符串的处理,今天我就把字符串的技巧先粗略总结一下,算是先热个身吧.
1.字符串里面基本技巧
比如我们有这么一段文本话:
text1='Hi Everyone your work is going to fill a large part of your life. ' \
'And the only way to be truly satisfied is to do what ' \
'you believe is great work in United Nations'
1).找最长的单词
![](https://img.haomeiwen.com/i3256786/767af83e55730a5a.png)
最长的单词是satisfied
2).找单词的长度是5或6
我列出了几个方法去分析,普通的推导列表,或者用高阶函数filter,map
![](https://img.haomeiwen.com/i3256786/8bb2ed4f118f3e70.png)
>>
['going', 'large', 'life.', 'truly', 'great', 'United']
['going', 'large', 'life.', 'truly', 'great', 'United']
['going', 'large', 'life.', 'truly', 'great', 'United']
3).列出首字母大写的单词
![](https://img.haomeiwen.com/i3256786/0c94c152c81772db.png)
可以直接用字符串里面的内置函数istitle
也可以用强大的正则表达式去过滤
4).使用最频繁的单词
![](https://img.haomeiwen.com/i3256786/677c48538ce3573e.png)
一般对列表里面的元素统计,我喜欢用collections里面的Counter函数,非常方便
2.字符串的分割
字符串的分割,相信很多小伙伴都会想到split函数,确实split非常方便,但是如果碰到复杂的字符串分割,你怎么办:
比如:
my_strings='qwer|tyu;iop|asd,fgh\tjkl\txyz'
这个字符串里面有很多杂七杂八的分割符,如果想用split()一次搞定,比如写成split('|;,\t')这样是不行的,如果我非常想用split有没有什么办法呢
1).霸王硬上弓split
我们无法用split一次搞定,但是我们可以多次迭代用split来分割
![](https://img.haomeiwen.com/i3256786/1ca5d5716a536066.png)
首先我们要分割的分割符放在一个列表里面[';','|',',','\t']
接着我们把my_strings这一串乱码迭代分割,用map来分割
map分割完毕之后会变成一个列表嵌套列表:
[['qwer'], ['tyu'], ['iop'], ['asd,fgh\tjkl\txyz']]
[['qwer'], ['tyu'], ['iop'], ['asd'], ['fgh\tjkl\txyz']]
[['qwer'], ['tyu'], ['iop'], ['asd'], ['fgh'], ['jkl'], ['xyz']]
所以我们一定要用一个新的列表把它碾平
>>
['qwer', 'tyu', 'iop', 'asd', 'fgh', 'jkl', 'xyz']
2).永远的正则
文本的处理永远无法绕开正则,当然有同学说sklearn,NLTK确实不假,但是正则绝对是根基和基础(正则我入门篇里写了3篇,需要的童鞋翻一下历史文章)
![](https://img.haomeiwen.com/i3256786/2fc090df4e6ddece.png)
导入re模块,用re.split()一招搞定
而且如果你的字符串里面有连续分割符比如|||,只能用正则去处理,上面第一种方法搞不定的
3.字符串的拼接
对于字符串的拼接,我们我们最常用的是+,也可以用join,二者好像看起来一样嘛,其实不一样的
比如:names=['Hello',' James',',',' how',' are',' you', '!']
1).用+号拼接
![](https://img.haomeiwen.com/i3256786/b0b0d65cd1da9f60.png)
>>
Hello
Hello James
Hello James,
Hello James, how
Hello James, how are
Hello James, how are you
Hello James, how are you!
Hello James, how are you!
我们把每一次的拼接都打印出来,发现其实每一次都分配了一个新的字符串
2).用join函数
print ''.join(names)
>>
Hello James, how are you!
一次搞定
3).复杂结构的字符混合列表
join函数虽然很好,但是如果list里面的元素种类繁多,怎么办
比如:names2=['Hello',123,'James']
![](https://img.haomeiwen.com/i3256786/fecec59320d43530.png)
我们可以用一个推到列表或者是高阶map函数把列表里面的元素都str化
或者用第二种方式生成一个生成器迭代一下,开销会小一点.
4)用+和join的区别
主要是开销的问题,如果你的字符串列表很大,很大性能上就会有明显的区别
![](https://img.haomeiwen.com/i3256786/833beb795dba82ee.png)
>>
cost:0.142536878586
cost:0.0240750312805
如果我们有一个一百万的字符串列表,里面有1000000个字符,我们用+和join两种方法去对比,我们用一个装饰器去计算运行时间,发现join的效率比+要高很多很多
关注微信公众号“菜鸟学Python”,留言获得更多干货源码!
网友评论
---------------------------------------------------实现效果---------------------------------------------------------
按住右箭头按键不放,飞船持续不断地往右移动,当停止按右箭头时,飞船停止移动。
-------------------------------------实现过程(书中标准的实现过程)--------------------------------------
在主程序中,有一个 while True,持续不断地监听键盘事件、以及监听飞船是否应该发生移动事件
while True:
#事件检查
gf.check_events(ship)
#检测飞船移动
ship.update()
事件检查(gf.check_events(ship))逻辑:
检测右箭头是否被按下,如果被按下,则右移标志位moving_right置为True
检测飞船是否移动(ship.update)逻辑:
判断 moving_right 是否为 true,如果为true,则x坐标向右移一位
---------------------------------------------------不明白的地方---------------------------------------------------既然事件检查 gf.check_events(ship) 本来就在主程序的 while True里面,是持续不断会循环的,那么当检测到右箭头按键按下时,何必多此一举设置右移标志位moving_right,然后再在主程序检测飞船是否应该移动(ship.update()),根据移动标志位,再改变坐标,直接在检测到右箭头按下时,将飞船的x坐标向右移一位,不就行了吗。
我试了我说的在判断右箭头按下时,直接将飞船的x坐标向右移一位,移动飞船,但是最终的效果是,按一下会向右移动一下,可是持续按的时候,也只向右移动一下,没有达到持续不断地往右移动的效果