Python:尝试创建and(或(value,value,value))的等价物

Python:尝试创建and(或(value,value,value))的等价物,python,boolean-logic,Python,Boolean Logic,好吧,这是我的困境: 我正在为subreddit开发一个常见问题机器人。我在布尔逻辑方面遇到了问题,可以使用一双更有经验的眼睛(这是我在Python中的第一次冒险)。现在这个机器人基本上是在滥发我创建的测试子Reddit。这里的示例显示了我遇到的确切问题,而不是分享这些具体信息: #Define Key Words ################################## #System Requirements Definitions sysReq1 = ('system requ

好吧,这是我的困境:

我正在为subreddit开发一个常见问题机器人。我在布尔逻辑方面遇到了问题,可以使用一双更有经验的眼睛(这是我在Python中的第一次冒险)。现在这个机器人基本上是在滥发我创建的测试子Reddit。这里的示例显示了我遇到的确切问题,而不是分享这些具体信息:

#Define Key Words
##################################
#System Requirements Definitions
sysReq1 = ('system requirements' and '?')
sysReq2 = ('can' and ('handle' or 'play' or 'run') and ('netbook' or 'notebook' or 'pc' or 'mac' or 'macbook' or 'laptop' or 'comp' or 'computer') and '?')
#System Requirements Response
sysReqResponse = 'PROGRESS'
##################################
testString1 = "i hate this"
#intended result for 1: nothing
testString2 = "is that real?"
#intended result for 2: nothing
testString3 = "What are the system requirements?"
#intended result for 3: 'PROGRESS'
print testString1
if (sysReq1 or sysReq2) in testString1.lower():
    print sysReqResponse
print testString2
if (sysReq1 or sysReq2) in testString2.lower():
    print sysReqResponse
print testString3
if (sysReq1 or sysReq2) in testString2.lower():
print sysReqResponse
运行时,它会显示:

i hate this
is that real?
PROGRESS
What are the system requirements?
PROGRESS
i hate this
is that real?
What are the system requirements?
PROGRESS
它不断返回testString2的值。我认为这与“?”有关,但真的不知道该怎么做,为什么,该怎么做。救命啊

编辑:以下是我希望它显示的内容:

运行时,它会显示:

i hate this
is that real?
PROGRESS
What are the system requirements?
PROGRESS
i hate this
is that real?
What are the system requirements?
PROGRESS
到目前为止,我发现如果我将我的
sysReq1=('system requirements'和'?')
更改为
sysReq1='system requirements'?'
,并且只检查
if
中的
sysReq1
,它会返回战斗值。问题是我真的需要这些
语句来减少混乱/冗余

sysReq2之所以存在,是因为有些人对相同的答案提出了不同的问题:

  • 它能在我的上网本上运行吗

  • 我的电脑能处理吗

  • 我可以在mac上玩吗


这不包括“我能不能”的变化,但你明白了。所有这些都应该返回相同的值(在本例中为“PROGRESS”)

在python中,包含布尔运算符的表达式的输出不必是布尔()
e、 例如,
sysReq1=('system requirements'和'?')
将使
sysReq1='?'
在这里注意,
sysReq1
不是布尔值,而是等于问号的字符串。类似地,
sysReq2
也将等于
。另外,在上面的链接中寻找真值测试,因为这将解释哪些值将被视为假表达式。

两个问题。首先,您不能使用
以及
来“存储”某种比较运算符以供以后使用。当您写入
以及
时,将立即计算结果。中介绍了此操作的规则

第二,你不能以那种方式使用
以及
<
中的code>不会“分布在”
上。在x中写入
('A'和'B')并不意味着“x中的A和x中的B”。它首先计算
('A'和'B')
(在本例中,这将为您提供
'B'
),然后检查单个结果是否在
x

使用简单的运算符无法实现所需的功能。无法仅使用
运算符来存储类似于您以后可以应用的复杂查询。您必须将条件转换为函数,并使用“测试字符串”作为参数调用它们:

def sysReq1(x):
    return 'system requirements' in x and '?' in x

>>> testString2 = "is that real?"
... testString3 = "What are the system requirements?"
... print testString2
... if sysReq1(testString2.lower()):
...     print "2 passed the test"
... print testString3
... if sysReq1(testString3.lower()):
...     print "3 passed the test"
is that real?
What are the system requirements?
3 passed the test
我建议您通力合作,掌握Python的基本知识。

我认为,这会对您有所帮助

代码 该函数不是严格必需的,但它确实使代码更易于维护。如果您需要更改支票,它只在一个地方更改

这是怎么回事? 首先,我们将两组字符串转换为一个列表和一组列表。然后要求变为“字符串必须包含
sysReq1
的所有元素,或者从
sysReq2
的每个子列表中至少包含一个元素”

我们通过将生成器与
any
all
函数相结合来完成此条件的检查。在存储
lower
之后,为了避免重复调用,我们创建了布尔的生成器(相当于迭代器)。每一个布尔值都告诉我们
sysReq1
中是否包含一个元素。然后我们将这个迭代器传递给第一个
all
,它检查列表是否包含all
True
s。如果是,则
all
函数返回
True
,第二次检查短路。否则,它将返回
False
,Python将越过
或。

对sysReq2的检查要复杂得多。首先,我们为每个子列表创建一个布尔生成器;这在
any
调用中。此列表包含一组布尔值,用于确定子列表的每个元素是否位于降低的字符串中。如果此布尔值列表(基于子列表)中的任何元素为
True
,则
any
调用将返回
True
。(顺便说一句,它会短路,而且因为我们使用的是一个生成器,所以在
True
之后的检查甚至不会运行,这与我们使用列表的情况不同。)然后我们创建另一个生成器;这一个包含每个子列表测试的结果(所有
任何
调用)。然后在此生成器上调用
all
,检查问题是否包含所有子列表中的元素

我要指出的是,如果用户直接输入,他们可以输入无意义的问题。例如,
“上网本可以玩kuguekf ugifugfj ugufsgjf nugjfgjfgj吗?”
将通过此检查

总结 使用生成器运行返回布尔值的测试。使用
any
all
组合布尔值的可比性

编辑 根据注释,这里有一个替代解决方案,它用空格分隔输入字符串,并使用s代替
list
s。我还从您列出的示例问题中添加了一个测试用例,以确保命中了
的第二部分

#Define Key Words
##################################
#System Requirements Definitions
sysReq1 = set(['system', 'requirements'])
sysReq2 = [set(['can'])
          ,set(['handle', 'play', 'run'])
          ,set(['netbook', 'notebook', 'pc', 'mac', 'macbook', 'laptop', 'comp', 'computer'])
          ]
def test(testString):
    if not testString.endswith('?'):
        return False

    lowerTestString = set(testString.rstrip('?').lower().split())
    return  lowerTestString.issuperset(sysReq1) or all(not lowerTestString.isdisjoint(i) for i in sysReq2)
#System Requirements Response
sysReqResponse = 'PROGRESS'
##################################
testString1 = "i hate this"
#intended result for 1: nothing
testString2 = "is that real?"
#intended result for 2: nothing
testString3 = "What are the system requirements?"
#intended result for 3: 'PROGRESS'
testString4 = "Can my PC handle it?"
#intended result for 4: 'PROGRESS'
print testString1
if test(testString1):
    print sysReqResponse
print testString2
if test(testString2):
    print sysReqResponse
print testString3
if test(testString3):
    print sysReqResponse
print testString4
if test(testString4):
    print sysReqResponse
我认为这相当简单。请注意,
set
构造函数接受一个iterable,因此我正在为此传递列表。“不分离”部分可能有点混乱;只是确保十字路口没有人。我使用它是希望函数能够实现,这样它就不会计算整个交点。问号是