此时此代码从用户处获取一个字符串,并将其与存储了许多单词的文本文件进行比较。然后它输出包含与字符串完全匹配的所有单词。 (E.G" 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))
答案 0 :(得分:1)
您必须修改isAnAnagram
和getAnagrams
功能。首先应编辑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)。