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

関数は希望どおりに機能しますが、出力についてサポートが必要です。1行で出力したいのですが、文言は見つかったアナグラムの量を反映している必要があります。(つまり、「アナグラムは1つだけ」、「アナグラムは」、「アナグラムはありません」、または「単語は辞書にありません」)コード内のコメントは私が試したものです。助けてくれてありがとう。

4

2 に答える 2

2

私があなたのプログラムを理解する方法では、ユーザーがCtrl-Dを押すまで(EOFエラーが発生し、ループが中断されるまで)、ユーザーに単語の入力を継続的に求めたいですか?その場合、ループの開始前にファイルを1回だけ読み取り、その中の単語のリストまたはセットを作成する必要があります。inputまた、この例外が関数内で発生する可能性があるのはこれだけであるため、try/exceptステートメントにはtoの呼び出しのみを含める必要があります。

次に、主な質問に移ります。結果の数を数え、それに応じてさまざまなステートメントを出力するには、リスト内包表記を使用して、入力のすべてのアナグラムのリストを取得します。次に、アナグラムを数え、それらを結合して出力文字列を形成できます。

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

したがって、アナグラム関数を次のように書き直すことができます。

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 に答える