复杂的复合布尔表达式

Complex compound boolean expression

我知道如何测试多个布尔条件(如下所示),但想知道我是否可以通过将变量分组在一起来组合测试多个布尔条件,如下所示?有没有办法以可理解的方式缩短有效但复杂的复合布尔条件(版本 1)?

(在我的真实代码中,实际测试字符串会在运行时发生变化,并且会是变量)。

示例:

AnimalString = 'We were looking for a mouse in our house.'
s = AnimalString

# 1) WORKS if-statement, but very long.
if 'dolphin' in s or 'mouse' in s or 'cow' in s:
    print('1: At least one listed animal is in the AnimalString.')

# 2) DOESN'T WORK Desired complex compound boolean expression
if ('dolphin' or 'mouse' or 'cow') in s:
    print('2: At least one listed animal is in the AnimalString.')

# 3) DOESN'T WORK Desired complex compound boolean expression
if 'dolphin' or 'mouse' or 'cow' in s:
    print('3: At least one listed animal is in the AnimalString.')

我知道为什么版本 2),3) 根据 SO 帖子不起作用 - here and here:

补充问题: 任何想法,也许,如果这可以以更清洁的方式解决?没有 any(),只有 tuples/lists 和运算符...

接受的解决方案:通过评论、答案和文档,这似乎是最好的解决方案:
any(item in AnimalString for item in ['dolphin', 'mouse', 'cow'])

我不确定我是否正确理解了这个问题,但我会给你一些我过去在复杂情况下使用的模式。

您可以使用的一种方法是函数 any,它允许您定义多种可能性的复杂逻辑,并为该条件提供动态输入。如果迭代器中的任何元素为 True,则此函数将为 return True。这使您可以将值与值集合进行比较,甚至可以将集合与其他值集合进行比较。这是一个例子:

AnimalString = 'We were looking for a mouse in our house.'
AnimalList = [ 'dolphin', 'mouse', 'cow' ]

if any( p in AnimalString for p in AnimalList ):
    print('At least one listed animal is in the AnimalString.')

如果你需要匹配的值,你可以使用next,如果你希望你的条件在所有元素中都为True,你可以使用all,这两种方法都有效以类似于 any 的方式。这些函数的示例:

AnimalMatch = next(( p for p in AnimalList if p in AnimalString ), None )
if AnimalMatch is not None:
    print('"%s" is in AnimalString.' % AnimalMatch)

if not all( p in AnimalString for p in AnimalList ):
    print('Not all animals are contained in AnimalString.')

另一种大逻辑条件的方法,有时很复杂,是使用 setdict。这允许您以高效的方式检查值的集合(因为您正在使用散列),允许匹配大量的值,甚至允许不同的输出(在 dict 的情况下) .这是示例:

# Example with set  
AnimalStringSet = set( AnimalString[:-1].lower().split() ) # preprocessing
if 'mouse' in AnimalStringSet: 
    print('At least one listed animal is in the AnimalString.')

# Example with dict
AnimalSoundsDict = { 'dolphin': 'click', 'mouse': 'squeak', 'cow': 'moo' }
if 'mouse' in AnimalSoundsDict: 
    print('The "%s" sounds like "%s"' % (Animal, AnimalSoundsDict[Animal]))
else:
    print('Animal "%s" not found' % Animal)

这种方法可能需要一些预处理,但在您必须处理大量值的情况下,这可能是值得的。

最后,对于字符串,您始终可以使用正则表达式或库 re 中的正则表达式,但这更容易使您的代码难以阅读。示例:

AnimalRegEx = '|'.join(AnimalList) # 'dolphin|mouse|cow'
if re.search(AnimalRegEx, AnimalString) is not None:
    print('At least one listed animal is in the AnimalString.')

您还可以将后两种方法与第一种方法结合使用。