【问题标题】:If substring in string, when substring has multiple valuesif substring in string,当 substring 有多个值时
【发布时间】:2014-08-04 11:05:25
【问题描述】:

我知道有办法解决它,但我想了解为什么这不起作用的基本逻辑。

这是一个非常简单的语句,只有当“或列表”中的第一个子字符串出现时才返回True。

for i in list:
    if (substring1 or substring2 or substring3) in string:
        print(string + " found!")

我在这里缺少什么?如果在字符串中找到任何子字符串,我认为 or 条件将等于 true。照原样,如果在字符串中找到 substring1,并且没有 substring2 或 substring3,我只会出现 true。

【问题讨论】:

    标签: python string substring


    【解决方案1】:
    substring1 or substring2 or substring3
    

    假设substring1 不是空字符串,则此表达式的计算结果为substring1,因为substring1 是真值。然后检查它是否在string 中。其他子字符串对语句没有影响。

    换句话说,ors 在in 之前求值,or 求值为它找到的第一个真值(这称为短路)。你不能用in那种方式来检查一个字符串中是否有多个子字符串。

    你想要:

    substring1 in string or substring2 in string or substring3 in string
    

    或者:

    substrings = (substring1, substring2, substring3)
    if any(s in string for s in substrings):
    

    【讨论】:

    • 我想我理解这背后的原因,但我不确定为什么它似乎完成了一个不完整的条件。我认为括号可以防止这个问题过早解决。
    • 括号导致它被评估首先
    【解决方案2】:
    >>> string = 'hello'
    >>> s1 = 'he'
    >>> s2 = 'll'
    >>> s3 = 'o'
    >>> (s1 or s2 or s3)
    'he'
    >>> 'he' in string
    True
    

    这里的问题是你首先评估(s1 or s2 or s3),如果s1 不评估为false,它将给你s1。在布尔上下文中,空字符串的计算结果为 false

    >>> s1 = ''
    >>> (s1 or s2 or s3)
    'll'
    

    你想要的是s1 in string or s2 in string or s3 in string,如果至少有一个子字符串在字符串中,这将返回true。

    【讨论】:

    • 您有什么建议可以最好地在字符串中查找多个子字符串,同时尽量减少代码并避免上述问题?
    • @vbiqvitovs 有一个元组或子字符串列表,然后按照建议使用any 函数。
    【解决方案3】:

    这是因为 python 使用惰性求值...例如...

    def error():
        raise ArithmeticError
    
    print "nothing" or error()
    

    将打印“nothing”,因为它在 python 代码中评估为 True 不检查错误,这通常会引发错误并阻止脚本继续...

    print False or error() #raises error and breaks script
    (substring1 or substring2 or substring3) #returns the first true value
    

    【讨论】:

      【解决方案4】:

      正确的代码应该是

      for i in list:
          if (substring1 in i ) or (substring2 in i) or (substring3 in i):
              print(i + " found!")
      

      上面的代码可以在子字符串有多个值时找到子字符串。

      (substring1 or substring2 or substring3)
      

      此表达式将返回括号中不为空的第一项。 例如,如果 subtring1 不为 null,它将返回 substring1 的值。 当 substring1 不为空时,

      (substring1 or substring2 or substring3) 
      

      等于

      substring1
      

      【讨论】:

        【解决方案5】:

        你可能想要any:

        if any(substr in string for substr in substrs):
          # At least one match 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-21
          • 1970-01-01
          • 2012-02-24
          • 1970-01-01
          • 2012-02-11
          • 2010-12-16
          • 2022-12-26
          相关资源
          最近更新 更多