Python:尝试创建and(或(value,value,value))的等价物
好吧,这是我的困境: 我正在为subreddit开发一个常见问题机器人。我在布尔逻辑方面遇到了问题,可以使用一双更有经验的眼睛(这是我在Python中的第一次冒险)。现在这个机器人基本上是在滥发我创建的测试子Reddit。这里的示例显示了我遇到的确切问题,而不是分享这些具体信息:Python:尝试创建and(或(value,value,value))的等价物,python,boolean-logic,Python,Boolean Logic,好吧,这是我的困境: 我正在为subreddit开发一个常见问题机器人。我在布尔逻辑方面遇到了问题,可以使用一双更有经验的眼睛(这是我在Python中的第一次冒险)。现在这个机器人基本上是在滥发我创建的测试子Reddit。这里的示例显示了我遇到的确切问题,而不是分享这些具体信息: #Define Key Words ################################## #System Requirements Definitions sysReq1 = ('system requ
#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
,它检查列表是否包含allTrue
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,因此我正在为此传递列表。“不分离”部分可能有点混乱;只是确保十字路口没有人。我使用它是希望函数能够实现,这样它就不会计算整个交点。问号是