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))
您必须编辑 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)。
目前这段代码从用户那里获取一个字符串,并将其与存储了很多单词的文本文件进行比较。然后它输出所有包含与字符串完全匹配的单词。 (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))
您必须编辑 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)。