python cookbook 读书笔记2(字符串处理2)
1.8检查字符集中是否包含某字符集中的字符,在以下几个例子中,也就是检查seq是否包含aset中的项,各函数中Any结尾是部分包含,也就是只要有其中元素就返回true,All结尾的是全部包含,必须包含所有才返回true。(这里的例子都是字符集,也就是以单个字符为单位,与字符的顺序无关)。
一般的这么写
>>> def containAny(seq,aset):
... for c in seq:
... if c in aset:return Ture
... return False
...
>>> a=['ee','etg4','g4g']
>>> b=['f3f','34f43']
>>> containAny(a,b)
False
使用迭代器代替for是更高级的方法,效率更高,但是代码易读性比较差,作者并不推荐,如下
>>> import itertools
>>> def cotainsAny2(seq,aset):
... for item in itertools.ifilter(aset.__contains__,seq):
... return True
... return False
...
>>> cotainsAny2(a,b)
False
对于这个问题,作者更推荐的是使用集合的方法
>>> a=[1,2,3,4]
>>> b=[1,2,3,3]
>>> def containsAll(seq,aset):
... return not set(aset).difference(seq)
...
>>> containsAll(a,b)
True
>>> containsAll(b,a)
False
而对于set的difference方法,是这样的
>>> set(a).difference(b)
set([4])
>>> set(b).difference(a)
set([])
相比于以上几种方式,作者更倾向于下一种方式,以下方式要调用两个字符串函数,这里先来介绍一下
① s.translate(table,str) 对字符串s移除str包含的字符,剩下的字符串按照table里的字符映射关系替换。table可以理解为转换表,比较'a' -> 'A', 'b'->'B'.
② tabel = string.maketrans('s1', 's2') s1 和 s2 的长度必须一致,maketrans生成一个转换表,若在s中有s1,则替换为s2,这个转换表是字符字符一个个对应的,没必要全部包含。(这里引自http://www.jb51.net/article/54404.htm)可以看一看。
>>> import string
>>> notrans=string.maketrans('','')#这里这么写是没有映射,保留原有的字符串。
>>> def containsAny(astr,strset):
... return len(strset)!=len(strset.translate(notrans,astr))
...
>>> def containsAll(astr,street):
... return not street.translate(notrans,astr)
>>> string1='asdfg'
>>> string2='asdfghjkl'
>>> string3='ferver'
>>> containsAny(string1,string2)
True
>>> containsAny(string2,string1)
True
>>> containsAny(string3,string1)
True
>>> containsAll(string3,string1)
False
>>> containsAll(string1,string2)
False
>>> containsAll(string2,string1)
True
1.9简化字符串translate方法的使用,作者在这里写了一个工厂函数,这个可以替换可以删除,个人觉得替换还是用replace好,本人才疏学浅,搞不懂python闭包,各位可以百度,这里给出函数。
>>> import string
>>> def translator(frm='',to='',delete='',keep=None):
... if len(to)==1:
... to=to*len(frm)
... trans=string.maketrans(frm,to)
... if keep is not None:
... allchars=string.maketrans('','')
... delete=allchars.translate(allchars,keep.translate(allchars,delete))
... def translate(s):
... return s.translate(trans,delete)
... return translate
...
>>> digits_only=translator(keep=string.digits)
>>> digits_only('hello world:123456')
'123456'
>>> no_digits=translator(delete=string.digits)
>>> no_digits('hello world:123456')
'hello world:'
>>> replace_digits=translator(from=string.digits,to='*')
File "<stdin>", line 1
replace_digits=translator(from=string.digits,to='*')
^
SyntaxError: invalid syntax
>>> replace_digits=translator(frm=string.digits,to='*')
>>> replace_digits('hello world:123456')
'hello world:******'
1.10过滤字符串中不属于指定集合的字符,本节作者还是使用了string下的translate方法,只是将translate又一次封装,使他更加易用。
>>> import string
>>> allchars=string.maketrans('','')
>>> def makefilter(keep):
... delchars=allchars.translate(allchars,keep)
... def thefilter(s):
... return s.translate(allchars,delchars)
... return thefilter
...
>>> my_filter=makefilter('abc')
>>> my_filter('agenrgbtgcandnbnnnccccb')
'abcabccccb'
上面的写法对unicode字符串是无效的,鉴于对unicode字符串的问题,作者使用如下方式解决。
>>> class Keeper(object):
... def __init__(self,keep):
... self.keep=sets.Set(map(ord,keep))
... def __getitem__(self,n):
... if n not in self.keep:
... return None
... return unichr(n)
... def __call__(self,s):
... return unicode(s).translate(self)
...
>>> makefilter=Keeper
>>> myfilter=makefilter('abc')
>>> myfilter(u'wfwbwrgwecwrfbwfwcrgfbwrcfbcb')
u'bcbcbcbcb'
python cookbook 读书笔记2(字符串处理2)相关推荐
- 《Python cookbook》笔记二
<Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...
- Machine Learning with Python Cookbook 学习笔记 第6章
Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...
- 【SQL.Cookbook读书笔记】——1检索记录
SQL.Cookbook读书笔记 前言 1检索记录 1.1从表中检索所有行和列 1.2从表中检索部分行(where) 1.3查找满足多个条件的行(where.and.or) 1.4从表中检索部分列 1 ...
- Machine Learning with Python Cookbook 学习笔记 第8章
Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...
- Machine Learning with Python Cookbook 学习笔记 第9章
Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...
- 计算机毕业设计django基于python的读书笔记共享平台
项目介绍 本论文主要论述了如何使用PYTHON语言开发一个读书笔记共享平台 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发.在引言中,作者将论述读书笔 ...
- 计算机毕业设计django基于python的读书笔记共享平台(源码+系统+mysql数据库+Lw文档)
项目介绍 本论文主要论述了如何使用PYTHON语言开发一个读书笔记共享平台 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发.在引言中,作者将论述读书笔记 ...
- 《零基础入门学习Python》读书笔记
写在前面 嘻,计划每个月读一本新书,这个月一直在忙考试,都没怎么学编程方面的知识,这是去年假期看的一本书,当时没有做笔记,现在都忘得差不多啦!!,嗯,在这个月的最后一天,写了这篇博客,笔记会陆续的整理 ...
- 《Python cookbook》笔记一
<Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...
最新文章
- 互联网+连接教育 全息时代即将来临
- iptables防火墙详解
- DOM操作中,遍历动态集合的注意事项。ex: elem.children
- 正则表达式在JS中的应用
- gitlab修改配置重启_centos7下gitlab安装说明
- 看几个源码,自己多做项目了!
- centos安装SVN独立服务器
- ubuntu中的大小写
- 学习dubbo(四): 启动时检查
- Improving your productivity in the Visual Studio Editor
- 联想Ideapad310s笔记本换屏线
- android+清除循环动画,android自定义View之(4)-一键清除动画
- 1896-2021历届奥运会奖牌榜动态排序(Matplotlib图表动画)
- Python买家具(类)
- 同济子豪兄-机器学习基础
- 分布式ID生成解决方案——推特雪花算法
- Footprint Analytics: 去中心化存储协议是否能取代中心化云存储?
- 云和恩墨大讲堂 X openGauss Meetup X 鲲鹏生态孵化营(上海站)完美落幕!
- 【姿态估计】PCK(Percentage of Correct Keypoints)指标及代码实现
- 三星9500android 8.0,三星note 8 高通835 N9500(国行、港行),8.0的安卓版本,可以自行安装xposed框架...