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)相关推荐

  1. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  2. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  3. 【SQL.Cookbook读书笔记】——1检索记录

    SQL.Cookbook读书笔记 前言 1检索记录 1.1从表中检索所有行和列 1.2从表中检索部分行(where) 1.3查找满足多个条件的行(where.and.or) 1.4从表中检索部分列 1 ...

  4. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  5. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  6. 计算机毕业设计django基于python的读书笔记共享平台

    项目介绍  本论文主要论述了如何使用PYTHON语言开发一个读书笔记共享平台 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发.在引言中,作者将论述读书笔 ...

  7. 计算机毕业设计django基于python的读书笔记共享平台(源码+系统+mysql数据库+Lw文档)

    项目介绍 本论文主要论述了如何使用PYTHON语言开发一个读书笔记共享平台 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发.在引言中,作者将论述读书笔记 ...

  8. 《零基础入门学习Python》读书笔记

    写在前面 嘻,计划每个月读一本新书,这个月一直在忙考试,都没怎么学编程方面的知识,这是去年假期看的一本书,当时没有做笔记,现在都忘得差不多啦!!,嗯,在这个月的最后一天,写了这篇博客,笔记会陆续的整理 ...

  9. 《Python cookbook》笔记一

    <Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...

最新文章

  1. 互联网+连接教育 全息时代即将来临
  2. iptables防火墙详解
  3. DOM操作中,遍历动态集合的注意事项。ex: elem.children
  4. 正则表达式在JS中的应用
  5. gitlab修改配置重启_centos7下gitlab安装说明
  6. 看几个源码,自己多做项目了!
  7. centos安装SVN独立服务器
  8. ubuntu中的大小写
  9. 学习dubbo(四): 启动时检查
  10. Improving your productivity in the Visual Studio Editor
  11. 联想Ideapad310s笔记本换屏线
  12. android+清除循环动画,android自定义View之(4)-一键清除动画
  13. 1896-2021历届奥运会奖牌榜动态排序(Matplotlib图表动画)
  14. Python买家具(类)
  15. 同济子豪兄-机器学习基础
  16. 分布式ID生成解决方案——推特雪花算法
  17. Footprint Analytics: 去中心化存储协议是否能取代中心化云存储?
  18. 云和恩墨大讲堂 X openGauss Meetup X 鲲鹏生态孵化营(上海站)完美落幕!
  19. 【姿态估计】PCK(Percentage of Correct Keypoints)指标及代码实现
  20. 三星9500android 8.0,三星note 8 高通835 N9500(国行、港行),8.0的安卓版本,可以自行安装xposed框架...

热门文章

  1. CSS动画,风车案例
  2. Pytest测试框架(二):pytest 的setup/teardown方法
  3. 软件测试如何提高测试的覆盖率,测试覆盖率是什么?
  4. 微信聊天记录不小心被删了怎么办?看看如何恢复吧!
  5. C语言程序设计(郝斌)
  6. 用Flash做点击页面图片切换效果的超级详细教程
  7. 【鸿蒙学院】鸿蒙App开发直播学员提问与回答
  8. AI芯片:寒武纪NPU设计分析(DianNao)
  9. 常用显卡驱动下载合集
  10. Jasper实现报表(Java)