def anagram(word,check):
for letter in word:
if letter in check:
check = check.replace(letter, '')
else:
return 0
return 1
while True:
f = open('dictionary.txt', 'r')
try:
user_input = input('Word? ')
for word in f:
word = word.strip()
if len(word)==len(user_input):
if word == user_input:
continue
elif anagram(word, input):
print (word)
#try:
#if word == 1:
#print ('The only anagram for', user_input, 'is', word)
#elif word > 1:
#print ('The anagrams for', user_input, 'are', word)
#except TypeError:
#pass
except EOFError:
break
f.close()
该功能可以按照我的意愿运行,但我需要一些输出帮助。我希望输出在一行中,并且措辞应该反映找到的字谜数量。 (即'只有一个字谜','字谜是','没有字谜',或'字不在字典中')代码中的注释是我尝试过的。谢谢你的帮助。
答案 0 :(得分:2)
我理解你的程序的方式,你想要不断提示用户输入单词,直到他按下Ctrl-D(导致EOF错误并打破循环)?在这种情况下,您应该在循环开始之前只读取一次文件,并在其中构造一个列表或一组单词。此外,您的try / except语句应该只包含对input
的调用,因为这是您的函数中唯一可能发生此异常的地方。
现在回答你的主要问题 - 计算结果的数量并相应地打印不同的语句,只需使用列表推导来获得输入的所有字符的列表。然后你可以计算字谜并将它们连接在一起形成一个输出字符串。
def find_anagrams():
with open("dictionary.txt", "r") as fileInput:
words = set(word.strip() for word in fileInput)
while True:
try:
user_input = input("Word? ").strip()
except:
break #you probably don't care for the type of exception here
anagrams = [word for word in words if anagram(word, user_input)]
print_results(anagrams)
def print_results(anagrams):
if len(anagrams) == 0:
print("there are no anagrams")
elif len(anagrams) == 1:
print("the only anagram is %s" % anagrams[0])
else:
print("there are %s anagrams: %s" % (len(anagrams), ', '.join(anagrams)))
此代码中唯一缺少的是检测输入字不是结果列表的一部分,但可以将其移动到anagram
函数。使用内置集合模块中的Counter类也可以简化该函数。这个类是一个类似字典的对象,可以从一个iterable构造,并将iterable中的每个对象映射到它出现的次数:
>>> Counter("hello") == {"h":1, "e":1, "l":2, "o": 1}
True
所以我们可以像这样重写anagram函数:
from collections import Counter
def anagram(word, check):
return not word == check and Counter(word) == Counter(check)
答案 1 :(得分:1)
您可以使用以下结果创建一个列表:
with open("dictionary.txt", "r") as fileInput:
user_input = input("Search keyword: ").strip()
listAnagrams = []
for line in fileInput.readlines():
for word in line.split(" "):
if len(word) == len(user_input):
if word == user_input:
continue
elif anagram(word, user_input):
listAnagrams.append(word)
if len(listAnagrams) == 1:
print ('The only anagram for', user_input, 'is', listAnagrams[0])
elif len(listAnagrams) > 1:
print ('The anagrams for', user_input, 'are', ", ".join(listAnagrams))
else:
print ('No anagrams found for', user_input)