Python有一个更清晰的方式来expression“如果x包含| b | c | d …”吗?

检查stringxy的子string的Pythonic方法是:

 if x in y: 

如果x等于abcdefg ,也是Pythonic:

 if x in [a,b,c,d,e,f,g]: 

但检查是否一些stringx包含abcdefg似乎很笨重:

 if a in x or b in x or c in x or d in x or e in x or f in x or g in x 

有更多的Pythonic方法来检查一个stringx包含一个列表元素?

我知道使用循环或使用正则expression式来自己写这个很简单:

 re.search('(dog|cat|bird|mouse|elephant|pig|cow)', x) 

但我想知道是否有一个更清洁的方式,不涉及正则expression式。

Pythonic方法将使用any()

 if any(s in x for s in (a,b,c,d,e,f,g)): 

从链接的文档:

any可迭代的

如果迭代的任何元素为真,则返回True。 如果迭代是空的,则返回False。 相当于:

 def any(iterable): for element in iterable: if element: return True return False 

另外,请注意,我在这里使用了一个元组而不是一个列表。 如果你的ag值是预定义的,那么一个元组确实是首选的。 请参阅: 元组是否比Python中的列表更有效?

 if any(q in x for q in [a,b,c,d,e,f,g]): 

我认为这就像你可以得到的那样简短和Pythonic。

晚会有点迟,但是

 not frozenset(x).isdisjoint(frozenset(y)) 

会工作,并可能会更快(algorithm,但可能不适用于较小的testing用例)。

没有使用any但只是max

 def is_in(symbol, lst): return max([symbol in x for x in lst]) print is_in('a',['ae','br','tl']) print is_in('c',['ae','br','tl']) 

 >>> True False