gpt4 book ai didi

Python:尝试创建与(或(值,值,值))的等价物

转载 作者:行者123 更新时间:2023-12-01 05:41:49 27 4
gpt4 key购买 nike

好吧,这就是我的困境:

我正在为 Reddit 子版 block 开发常见问题解答机器人。我在 bool 逻辑方面遇到了麻烦,需要一双更有经验的眼睛(这是我在 Python 中的第一次冒险)。现在,该机器人基本上正在向我创建的测试 subreddit 发送垃圾邮件。这里没有分享特定信息,而是显示了我遇到的确切问题:

#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

它不断返回 testString2 的值。我认为这与“?”有关。但真的不知道如何、为什么或做什么。救命!

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

当你运行它时,它会显示:

i hate this
is that real?
What are the system requirements?
PROGRESS

到目前为止,我发现如果我将 sysReq1 = ('系统要求' and '?') 更改为 sysReq1 = '系统要求' '?' 并且仅检查 sysReq1if,它会返回战斗值。问题是我确实需要这些 or 语句来减少困惑/冗余。

sysReq2 存在的原因是因为有些人对相同的答案提出不同的问题:

  • 它可以在我的上网本上运行吗?

  • 我的电脑可以处理吗?

  • 我可以在 Mac 上玩吗?

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

最佳答案

我认为any , all ,和 generators可以在这里帮助您。

代码

#Define Key Words
##################################
#System Requirements Definitions
sysReq1 = ['system requirements', '?']
sysReq2 = [['can']
,['handle', 'play', 'run']
,['netbook', 'notebook', 'pc', 'mac', 'macbook', 'laptop', 'comp', 'computer']
,['?']
]
def test(testString):
lowerTestString = testString.lower()
return all(i in lowerTestString for i in sysReq1) or all(any(j in lowerTestString for j in 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'
print testString1
if test(testString1):
print sysReqResponse
print testString2
if test(testString2):
print sysReqResponse
print testString3
if test(testString3):
print sysReqResponse

该函数并不是绝对必要的,但它确实使代码更易于维护。如果您需要更改支票,则仅更改一处。

这是怎么回事?

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

我们通过将生成器与 anyall 函数组合来完成检查此条件。在存储了 lower 以避免重复调用之后,我们创建了一个 bool 值生成器(相当于一个迭代器)。每个 bool 值告诉我们 sysReq1 的单个元素是否包含在 lowered 中。然后我们将此迭代器传递给第一个 all,它检查列表是否包含所有 True。如果是,则 all 函数返回 True 并且第二个检查被短路。否则,它返回 False 并且 Python 继续前进到 or 后面。

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

我会注意到,如果用户直接输入问题,他们可能会输入无意义的问题。例如,“Play can netbook kuguekf ugifugfj ugufsgjf nugjfgjfgj?” 将通过此检查。

摘要

使用生成器运行返回 bool 值的测试。使用 anyall 组合 bool 值的可迭代对象。

编辑

根据评论,这里有一个替代解决方案 split s 输入字符串中的空格并使用 set s 而不是 list。我还从您列出的示例问题中添加了一个测试用例,以确保 or 的第二部分被命中。

#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 构造函数采用可迭代对象,因此我只是为此传递列表。 “不相交”部分可能有点令人困惑;只是确保交叉路口不为空。我使用它是希望实现该函数,以便它不会计算整个交集。问号有问题,因为它没有用空格分隔,所以我只是确保字符串以问号和 rstrip 结尾。编辑掉它。

实际上,这种实现可能比具有大量生成器的实现更干净、更易于维护。

关于Python:尝试创建与(或(值,值,值))的等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17335003/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com