需要Discord Bot来检查大文本块是否包含json中的键

xe55xuns  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(100)

我正在做一个机器人,它会检查一条消息是否包含一个值为"弱"的密钥,如果包含,它应该发送消息中的密钥。
但是,我的代码面临两个问题。
当我做!评分aban时,它会给我一个响应,然而,如果我做!评分abi ayyash,(它有空格)它就不再起作用了,
此外,我的代码应该检查是否特定的关键是在消息中,如果我有一个关键的"aban测试",但我也有一个关键称为"aban"和"测试",它不应该显示我"aban"和"测试"分开找到,而只有"aban测试"
这是密码。

@commands.command()
async def grading(self, ctx, *message):
    found_keys = [weak for weak in message if weak in narrators.keys()]
    nars = ', '.join(found_keys)
    await ctx.send("This is unreliable because of:\n" + nars)

这里是json

{"aban": "weak", "aban b. abi ayyash": "weak", "abi ayyash": "weak"}
fafcakar

fafcakar1#

这是由循环和参数列表中的*引起的。

async def command(ctx, *, message):

在这个(您的)例子中,!command a string with spaces将导致message成为"a string with spaces",这就是您想要的(从您的问题判断)。
但是,当循环遍历消息([weak for weak in message])时,您将循环遍历字符串的每个字符,因此字典中没有("a", " ", "s", "t", ...)和这些字符。
我相信你想检查它的 * 相反的方式 *:检查 dictionary 中的键是否在 message 中。
另一种选择是检查消息中的独立单词(而不是字符),并通过将参数改为*message而不是*, message(注意*的位置)来循环 that,这将把消息拆分成一个由独立单词组成的元组。
然而,这样你就不能再检查多个单词的键了。这意味着你不得不让你的循环更复杂一些。跟踪一串以前见过的键。在每次迭代中看看{previous} {current}是否在你的dict中。如果是,继续(可能会出现一个更长的单词)。如果不是,那么前一个是最长的可能匹配&您应该将其添加到“弱单词”列表中。
这个 * 稍微 * 复杂一些的循环(它就像4行基本Python,并不那么难)是为了解决第二个问题,即您想要尽可能长的键。

ymzxtsji

ymzxtsji2#

您要寻找的是组合,itertools中有一个名为combinations的函数可以使用。
我们还需要使用所有的长度,从1到len(message) + 1,这样我们就可以穷尽所有的可能性,我们使用解包操作符*,这样我们就可以在以后链接它。
此外,如果使用in操作符,则不需要使用.keys()方法,因为它会自动检查密钥。

from itertools import combinations, chain

@commands.command()
async def grading(self, ctx, *message):
    found_keys = [weak for weak in chain(message, *(combinations(message, i) for i in range(1, len(message)+1))) if (weak_key := " ".join(weak)) in narrators]
    nars = ', '.join(found_keys)
    await ctx.send("This is unreliable because of:\n" + nars)

就上下文而言,这相当于下面的内容(以防不清楚)。

from itertools import combinations, chain

@commands.command()
async def grading(self, ctx, *message):
    found_keys = []
    for key_group in chain(message, *(combinations(message, i) for i in range(1, len(message)+1))):
        weak = " ".join(key_group)
        if weak in narrators:
            found_keys.append(weak)
    nars = ', '.join(found_keys)
    await ctx.send("This is unreliable because of:\n" + nars)

如果您也希望使用无序配对,请使用permutations而不是combinations。有关更多内容,请查看文档页面上的示例

相关问题