【问题标题】: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)

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

【问题讨论】:

    标签: python if-statement python-3.x substring


    【解决方案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 每次都会检查每个字符串。
      猜你喜欢
      • 1970-01-01
      • 2018-09-14
      • 2012-01-04
      • 2021-04-25
      • 2015-06-12
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多