Displaying posts tagged with

“itertools”

Python食谱-1.19.判断字符串是否以多个字符串中的一个结尾

原文作者:Michele Simionato 中文翻译:Tony (digitalsatori) 问题 对于一个指定的字符串s,如何判断其是否以多个字符串中的任意一个结尾;或者说,有没有一个等效但更简洁明了的方法来表示 s.endwith(end1) or s.endwith(end2) or s.endwith(end3) ... 解决方法 itertools.imap 函数是解决此类问题简洁有效的方法: import itertools def anyTrue(predicate, sequence): return True in itertools.imap(predicate, sequence) def endsWith(s, *endings): return anyTrue(s.endswith, endings) 讨论 endsWith 的一个典型应用就是输出当前目录下的所有图片文件的名称: import os for filename in os.listdir('.'): if endsWith(filename, '.jpg', '.jpeg', '.gif'): print filename 本配方的解决方案中的通用处理方法同样适用与其它对字符串的检测判断。辅助函数 anyTrue 很通用,运行速度也快,我们可以传递任何'绑定方法‘(bound methods)给其第一个参数(predicate),比如: s.startwith` 或者 ``s.__contains__ 等等。实际上根本不使用 [...]

Python食谱-1.8.检查字符串中是否包含一个集合中的字符

原文作者:Jurgen Hermann, Horst Hansen 中文编译:Tony(digitalsatori) 问题 如何检查一个集合(Set)中的任意一个字符是否包含在一个字符串中 解决方法 下面是一个简单,清晰,又通用的实现方法(它可以适用于任何“序列”,而不仅限于字符串,同时也支持任何可以检测其成员的容器对象,而不仅针对集合(Set): def containsAny(seq, aset): """检查序列seq中是否包含aset的任何一个成员对象""" for c in seq: if c in aset: return True return False 你还可以利用itertools标准库模块,来构造与上述方法等效的高阶的,较复杂的方法。这种方法比上述的方法速度上要快一些: import itertools def containsAny(seq,aset): for item in itertools.ifilter(aset.__contains__, seq): return True return False 讨论 大多数与集合相关的问题最好使用Python2.4以后引入的内置类型set。(如果你使用Python2.3你可以使用其标准库中等效的sets.Set类型)但是,凡事皆有例外。比如上面的问题用纯粹的基于set的方法来处理,会是这样的: def containsAny(seq, aset): return bool(set(aset).intersection(seq)) 但是使用这种方法,seq中的每个成员都不可避免的要被全部测试。而在解决方法中的方法则会在找到答案后立即返回,不必遍历所有的成员。这对于处理一个非常长的序列来说就很重要了。 解决方法中的的第一个版本简单,清晰。第二个方法则显得“机巧”,在Python世界里这绝对不是一个赞誉之词。Python的核心价值体现在简单,清晰。但是,第二个版本也非常值得考虑。因为它是基于标准库中itertools模块的高阶实现方法。高阶实现方法多数情况下优于低阶实现方法(当然实际应用中还是要就事论事)。 itertools.ifilter 将一个‘判断‘(predicate)和一个可遍历对象(iterable)作为其参数,并且当'可遍历对象'中的成员满足'判断'时yield该成员对象。在本例中我们用 aset.__contains__ 来作为“判断”。所以,只要 ifilter 能yield任何值,它yield是seq中的某个成员对象,并且其同时也是aset中的成员。 什么是"判断“(Predicate)? [...]