Python 是不是有更简洁的方式来表达“如果 x 包含 a|b|c|d...”? [复制]

Posted

技术标签:

【中文标题】Python 是不是有更简洁的方式来表达“如果 x 包含 a|b|c|d...”? [复制]【英文标题】:Does Python have a cleaner way to express "if x contains a|b|c|d..."? [duplicate]Python 是否有更简洁的方式来表达“如果 x 包含 a|b|c|d...”? [复制] 【发布时间】:2013-11-11 21:40:17 【问题描述】:

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

if x in y:

判断x是否等价于abcdefg也是Pythonic:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

Pythonic 方法是使用any():

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

来自链接的文档:

any(可迭代)

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

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

另外,请注意我在这里使用了元组而不是列表。如果您的 a-g 值是预定义的,那么元组确实是首选。见:Are tuples more efficient than lists in Python?

【讨论】:

不需要内括号 any(s in x for s in a, b, c, d, e, f, g) 就可以了。 @Igonato 至少在 Python 3 上这是一个语法错误。 @Igonato 我发现内括号增加了可读性。 @chepner:你不能。 a,b,c,.. 是变量,而不是字符! @CeasarBautista 不,那完全不同。你有什么检查x的任何字符是否在集合a,...,g中,这不是我们想要的。【参考方案2】:
if any(q in x for q in [a,b,c,d,e,f,g]):

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

【讨论】:

【参考方案3】:

聚会有点晚了,但是

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

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

【讨论】:

我觉得这一篇更难读。 这个比较晦涩 @siledh 不是真的,它在其他一些答案中被引用,并且使用set 和类似类型将降低查找成本的事实也不是太深奥。【参考方案4】:

不使用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

【讨论】:

max(...)max([...]) 更快。 any(...)max(...) 快得多... 是的,any 更可取,因为它会在找到匹配项时短路,max 每次都会检查每个字符串。

以上是关于Python 是不是有更简洁的方式来表达“如果 x 包含 a|b|c|d...”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c# - 是不是有更简洁的方法来检查变量是不是是多个事物之一?

是否有更简洁的方法来获取错误和 Promise 的结果 [重复]

仅在 C 中执行一次代码的更简洁的方法?

定义默认数组值的最简洁方式

我可以简化这个使用逻辑否定运算符的条件语句吗?

有没有更简洁的方法来编写这个轮询循环?