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
是否等价于a
、b
、c
、d
、e
、f
或g
也是Pythonic:
if x in [a,b,c,d,e,f,g]:
但是检查某个字符串 x
是否包含 a
、b
、c
、d
、e
、f
或 g
似乎很笨拙:
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# - 是不是有更简洁的方法来检查变量是不是是多个事物之一?