检查可以由另一个词组成的可能词数的函数 (Python 3.6)

Function to check the number of possible words that can be made up from another word (Python 3.6)

所以我已经设置了这个作业,我必须制作一个程序,输入一个 9 个字母的单词,然后尝试输入所有可能的单词,这些单词可以由最初输入的单词的字母组成。只有当它们与给定文本文件(已在程序中转换为单词列表 wordList)中包含的单词匹配时,可能的单词才有效,除此之外,这里不相关。在这个特定任务之前,我对此没有任何问题:"The total number of possible correct answers is counted and displayed"。需要在输入原始单词后立即显示可以由原始单词的字母组成的可能正确单词的总数,以便用户知道他们的目标是什么。但是,我对此有一些问题。我试图用以下函数完成这个任务:

def totalPossible(masterWord):
    total = 0
    answers = []
    for word in wordsList:

        if word[:-1] in masterWord:
        total += 1
        answers.append(word[:-1])

    #The [:-1] is there because there is a \n at the end of every word in the wordsList

    return total

只有当每个字母都按顺序排列的整个单词都出现在 masterWord 中时,该函数才有效,如果构成 wordsList 中每个单词的单个字母都出现在 masterWord 中,我认为这是需要做的。例如,如果原始单词 masterWord 是 'ADDICTION',我的函数将识别 wordsList 中的两个 "words",它们是 'ADDICTION' 本身和 'TION'(不要问我为什么)并会增加总数并相应地附加答案列表,但不会识别像 'COAT' 这样的东西,这是一个有效答案并且也存在于 wordsList 中但未被我的函数检测为可能的答案.那么,我如何让这段代码检查 wordsList 中每个单词的单个字母与 masterWord 的对比,以便找出 wordsList 中的每个单词是否是可以由 masterWord 中的字母组成的单词,然后每次递增总计数器一次发现 wordsList 中的一个单词是由 ​​masterWord 中的字母组成的。 P.S。 masterWord 只是一个表示 1 个九字母单词的字符串。

输出示例: 输入单词(masterWord):[此处单词]

有 x(这是总数)个可能的单词可以由该单词组成。

您正在测试 'coat' 是否在 'addiction' 中。虽然 'coat' 中的字母确实也在 'addiction' 中,但它们没有按顺序出现,所以你的测试 returns False。相反,您需要查看出现在 'coat' 中的所有字母是否也出现在 'addiction' 中,而不考虑顺序 。请参阅下面的示例,了解应该如何进行。

# first, properly import your word list to get rid of whitespace
# in each word (i.e. the \n character). Something like:

wordsList = []

with open('wordList.txt', 'r') as file:
    for line in file:
        word = line.strip()
        if word:
            wordsList.append(word)
            # may want to modify case of letters in word as well
            # if so, see word.upper() or word.lower()

# then you need to confirm each letter of each word appears in masterWord
# Something like:

def totalPossible(masterWord):

    total = 0
    answers = []

    for word in wordsList:
        in_total = 0
        for char in word:
            if char in masterWord: # case must match
                in_total += 1
        if in_total == len(word):
            total += 1
            answers.append(word)

    return total, answers # also return your answer list

Counter class 是解决此类问题的好工具:

>>> from collections import Counter
>>> word_list = ["coat", "add", "zebra", "foo"]
>>> def possible_words(master_word):
...     master = Counter(master_word)
...     return [
...         word for word in word_list
...         if all(master.get(c, 0) >= Counter(word)[c] for c in word)
...     ]
...
>>> possible_words("addiction")
['coat', 'add']
>>> len(total_possible("addiction"))
2