Displaying posts tagged with

“set”

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)? [...]

Python食谱-1.1.依次处理字符串中的每个字符

原文作者:Luther Blissett 中文翻译:Tony Gu (digitalsatori) 问题 如何才能根据需要依次处理字符串中的每个字符? 解决办法 我们可以创建一个以字符串中每个字符为成员的列表。(Python中并没有所谓”字符“的类型,这里的字符是指长度为1的字符串)。调用Python内置函数 list ,将字符串作为其参数: thelist = list(thestring) 其实象这样的列表也不需要创建,因为我们可以用for语句直接遍历字符串: for c in thestring: do_something_with(c) 或者使用列表推导(list comprehension): results = [do_something_with(c) for c in thestring] 也可以使用Python内置函数 map 调用其它的函数,使其操作于字符串的每个字符上,其效果与列表推导完全一样: results = map(do_something, thestring) 讨论 在Python中,字符就是长度为1的字符串。我们可以通过循环遍历一个字符串来访问其所包含的每个字符。如果你想调用一个函数来操作字符串上的每一个字符,那么可以使用 map 来处理。对一个字符串调用内置函数 list 可以获得该字符串的子串列表,该列表的每个成员字串的长度为1(也就是字符串的每个字符)。如果你想获得字符串上所有字符的集合(Set),可以调用sets.(译者注: 集合与上述列表的一个差别:一个集合内没有相同的成员项,列表则不然) import sets magic_chars = sets.Set('abracadabra') poppins_chars = sets.Set('supercalifragilisticexpialidocious') print ''.join(magic_chars & poppins_chars) [...]