从单词列表中查找给定句子的字谜

Posted

技术标签:

【中文标题】从单词列表中查找给定句子的字谜【英文标题】:Find anagrams of a given sentence from a list of words 【发布时间】:2019-06-25 11:43:45 【问题描述】:

我有一个没有空格只有小写字母的句子,例如:

"johndrinksmilk"

还有一个单词列表,其中仅包含可能是上述句子的字谜的单词,这些单词也按字母顺序排列,例如:

["drink","drinks","john","milk","milks"]

我想创建一个函数(不使用库),它返回一个由三个单词组成的元组,这些单词一起可以构成给定句子的字谜。这个元组必须是句子的最后一个可能的字谜。如果给定列表中的单词不能用于构成给定句子,则该函数应返回 None。因为我知道我很不擅长解释事情,所以我会试着给你一些例子:

例如,用:

sentence = "johndrinksmilk"
g_list = ["drink","drinks","john","milk","milks"]

结果应该是:

r_result = ("milks","john","drink")

虽然这些结果应该是错误的:

w_result = ("drinks","john","milk")
w_result = None
w_result = ("drink","john","milks")

我试过了:

def find_anagram(sentence, g_list):     
g_list.reverse()
for fword in g_list:       
    if g_list.index(fword) == len(g_list)-1:
        break
    for i in range(len(fword)):
        sentence_1 = sentence.replace(fword[i],"",1)
    if sentence_1 == "":
        break
    count2 = g_list.index(fword)+1
    for sword in g_list[count2:]:
        if g_list.index(sword) == len(g_list)-1:
            break
        for i in range(len(sword)):
            if sword.count(sword[i]) > sentence_1.count(sword[i]):
                break
            else:
                sentence_2 = sentence_1.replace(sword[i],"",1)
        count3 = g_list.index(sword)+1
        if sentence_2 == "":
            break
        for tword in g_list[count3:]:
            for i in range(len(tword)):
                if tword.count(tword[i]) != sentence_2.count(tword[i]):
                    break
                else:
                    return (fword,sword,tword)
return None

但不是返回:

("milks","john","drink")

它返回:

None

谁能告诉我怎么了?如果您认为我的函数不好,请随时向我展示不同的方法(但仍然不使用库),因为我觉得我的函数既复杂又非常缓慢(当然是错误的......)。

感谢您的宝贵时间。

编辑:根据要求提供新示例。

sentence = "markeatsbread"
a_list = ["bread","daerb","eats","kram","mark","stae"] #these are all the possibles anagrams

正确的结果是:

result = ["stae","mark","daerb"]

错误的结果应该是:

result = ["mark","eats","bread"]   #this could be a possible anagram, but I need the last possible one
result = None        #can't return None because there's at least one anagram

【问题讨论】:

您能解释一下为什么您的测试用例会通过和失败吗?我不确定你到底想要什么。 当然。测试“if g_list.index(fword) == len(g_list)-1:”查看 fword 是否是列表中的最后一个词,因为如果它是最后一个词,我将无法搜索第二个和第三个词。所以我找不到任何三个单词的元组,它们是给定句子的字谜。与“if g_list.index(sword) == len(g_list)-1:”相同,如果找到的第二个单词是列表的最后一个,则不会找到任何第三个单词,所以我应该搜索另一个第一个词(fword)。 "if Sword.count(sword[i]) > sentence_1.count(sword[i]):" 确保第二个单词包含可以在给定句子中找到的字符。 我还是不太明白。你能给我更多关于什么是正确结果的例子吗? 像“if sentence_1 == :”“”和“if sentence_2 ==”“”这样的测试:确保我没有找到两个一起完成字谜的单词(因为我需要三个单词,不是两个”。最后一个:“if tword.count(tword[i]) != sentence_2.count(tword[i]):” 确保句子中包含第三个单词的所有字母,否则不是正确的词。感谢您的帮助,如果我仍然无法解释自己,请随时告诉我。我会尽力为您提供更多示例。 对不起,我的意思是像 "johndrinksmilk" 的其他测试被认为是正确的示例。您提供了r_result 的一个示例,是否还有更多示例符合相同字符串的条件?如果是这样,请提供它们,以便我更好地理解它。 :) 【参考方案1】:

试试这个,看看它是否适用于您的所有案例:

def findAnagram(sentence, word_list):
    word_list.reverse()
    for f_word in word_list:
        if word_list[-1] == f_word:
            break
        index1 = word_list.index(f_word) + 1
        for s_word in word_list[index1:]:
            if word_list[-1] == s_word: break
            index2 = word_list.index(s_word) + 1
            for t_word in word_list[index2:]:
                if (sorted(list(f_word + s_word + t_word)) == sorted(list(sentence))):
                    return (f_word, s_word, t_word)

希望对你有所帮助

【讨论】:

以上是关于从单词列表中查找给定句子的字谜的主要内容,如果未能解决你的问题,请参考以下文章

代码高尔夫:查找所有字谜

查找字典单词的字谜

查找给定单词的字谜

编写一个字谜查找器(来自 txt 文件中的单词列表)[重复]

查找字谜 JavaScript jQuery

在给定的字符串列表中查找字符串的所有字谜