关于if语句:Python是否有更简洁的方式来表达“如果x包含| b | c | d …”?

Does Python have a cleaner way to express “if x contains a|b|c|d…”?

本问题已经有最佳答案,请猛点这里访问。

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

1
if x in y:

如果x等同于abcdefg也是pythonic:

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

但是,检查一些字符串x是否包含abcdefg看起来很笨拙:

1
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是否包含列表的元素?

我知道自己用循环或使用regex来写这篇文章很简单:

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

但我想知道是否有一个更清洁的方法,不涉及regex。


肾盂入路采用any()

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

从链接的文档中:

any(iterable)

Return True if any element of the iterable is true. If the iterable is empty, return False. Equivalent to:

1
2
3
4
5
def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

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


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

我认为这大概是你所能得到的最短和最短的Python。


参加聚会有点晚,但是

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

会起作用,而且可能更快(从算法上讲,但对于较小的测试用例可能不会)。


不使用any,只使用max

1
2
3
4
5
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'])

给予

1
2
3
>>>
True
False