Python 个带有字谜的字符串

Python strings with anagrams

目前这段代码从用户那里获取一个字符串,并将其与存储了很多单词的文本文件进行比较。然后它输出所有包含与字符串完全匹配的单词。 (EG "otp = opt, top, pot) 当前,当我输入字符串时,它仅将字符串与重新排列的顺序中具有完全相同字母的单词匹配。

我的问题是如何才能输入多余的字母但仍然输出包含的所有单词?例如:输入 "orkignwer" 程序将输出 "working" 即使有多余的字母。

words = []


def isAnAnagram(word, user):
    wordList= list(word)
    wordList.sort()
    inputList= list(user)
    inputList.sort()
    return (wordList == inputList)

def getAnagrams(user):
    lister = [word for word in words if len(word) == len(user) ]
    for item in lister:
        if isAnAnagram(item, user):
            yield item


with open('Dictionary.txt', 'r') as f:
    allwords = f.readlines()
f.close()

for x in allwords:
    x = x.rstrip()
    words.append(x)
inp = 1


while inp != "99":
    inp = input("enter word:")
    result = getAnagrams(inp)
    print(list(result))     

您必须编辑 isAnAnagramgetAnagrams 函数。首先,应该编辑 getAnagrams 函数以在 lister 列表中也包括更长的单词:

def getAnagrams(user):
    lister = [word for word in words if len(word) <= len(user) ]
    for item in lister:
        if isAnAnagram(item, user):
            yield item

然后您需要编辑 isAnAnagram 函数。正如 Alexander Huszagh 指出的那样,您可以使用 collections 包中的计数器:

from collections import Counter

def isAnAnagram(word, user):
    word_counter = Counter(word)
    input_counter = Counter(user)
    return all(count <= input_counter[key] for key, count in word_counter.items())

all(count <= input_counter[key] for key, count in word_counter.items()) 检查 word 的每个字母是否在 user 中出现的次数至少与它们在 word 中出现的次数一样多。

P.S。如果您想要一个更优化的解决方案,您可能需要检查 TRIE(例如 MARISA-trie、python-trie 或 PyTrie)。