如何缩短(Pythonic)?

时间:2010-08-30 13:35:58

标签: python

如果它们在字符串中,我必须检查很多世界...代码如下:

if "string_1" in var_string or "string_2" in var_string or "string_3" in var_string or "string_n" in var_string:
    do_something()

如何让它更具可读性和更清晰?

6 个答案:

答案 0 :(得分:35)

这是一种方式:

words = ['string_1', 'string_2', ...]

if any(word in var_string for word in words):
    do_something()

参考:any()

<强>更新

为了完整性,如果您只想在字符串中包含所有字时执行该功能,则可以使用all()代替any()

另请注意,此构造不会执行任何不必要的计算,因为any如果遇到true值并且generator expression用于创建布尔值,则会返回。所以你也有一些 short-circuit evaluation ,它通常在评估布尔表达式时使用。

答案 1 :(得分:2)

import re
if re.search("string_1|string_2|string_n", var_strings): print True

python正则表达式的美妙之处在于它返回一个正则表达式对象(它给出了匹配的信息)或None,它可以在测试中用作“假”值。

答案 2 :(得分:2)

使用正则表达式:

import re
words = ['string_1', 'string_2', ...]

if re.search('|'.join([re.escape(w) for w in words]), var_string):
    blahblah

答案 3 :(得分:1)

你看过滤镜吗?

filter( lambda x: x in var_string, ["myString", "nextString"])

然后可以与map结合使用

map( doSomething(), filter(lambda x: x in var_string, ["myString", "nextString"] ) )

编辑:

当然不能做你想要的。使用any解决方案。出于某种原因,我认为你希望每次都这样做而不是一次。

答案 4 :(得分:0)

>>> import re
>>> string="word1testword2andword3last"
>>> c=re.compile("word1|word2|word3")
>>> c.search(string)
<_sre.SRE_Match object at 0xb7715d40>
>>> string="blahblah"
>>> c.search(string)
>>>

答案 5 :(得分:0)

实现这一目标的另一种方法 check = lambda a: any(y for y in ['string_%s'%x for x in xrange(0,10)] if y in a)

print check('hello string_1')