75

x检查字符串是否为子字符串的 Pythonic 方法y是:

if x in y:

查找 ifx等价于a, b, c, d, e, forg也是 Pythonic:

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

但是检查某个字符串是否x包含a, b, c, d, e,fg看起来很笨重:

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的方法来检查字符串是否x包含列表的元素?

我知道使用循环或使用正则表达式自己编写它是微不足道的:

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

但我想知道是否有一种不涉及正则表达式的更清洁的方法。

4

4 回答 4

122

Pythonic 方法是使用any()

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

从链接的文档中:

any可迭代

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

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

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

于 2013-10-31T18:32:32.857 回答
27
if any(q in x for q in [a,b,c,d,e,f,g]):

我认为这是尽可能短的和 Pythonic 的。

于 2013-10-31T18:32:39.107 回答
10

派对有点晚了,但是

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

会起作用,并且可能更快(在算法上,但可能不适用于较小的测试用例)。

于 2013-11-01T05:25:51.430 回答
3

不使用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
于 2013-11-01T04:05:45.540 回答