0
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()

该功能按我的意愿工作,但我需要一些关于输出的帮助。我希望在一行中输出,并且措辞应该反映找到的字谜的数量。(即“只有一个字谜”、“字谜是”、“没有字谜”或“字典中没有这个词”)代码中的注释是我尝试过的。谢谢你的帮助。

4

2 回答 2

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 类来简化该功能。此类是一个类似字典的对象,可以从可迭代对象中构造,并将可迭代对象中的每个对象映射到其出现次数:

>>> 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)
于 2012-12-06T21:49:42.530 回答
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)
于 2012-12-06T20:38:16.343 回答