2016-08-31 10 views
1

私はアナグラムソルバーのPython 2.7に作成しています。Python - リスト内のすべての文字と文字列内の文字だけが一致するかどうかを確認しますか?

ソルバーは、ユーザーが入力したアナグラムを受け取り、各文字をリスト項目に変換し、リスト項目を '.txt'ファイルの行に対してチェックし、アナグラムの文字に一致する単語をpossible_wordsリストに追加します。印刷。

作品... ほぼ!無重複文字でアナグラムについては


# Anagram_Solver.py 

anagram = list(raw_input("Enter an Anagram: ").lower()) 

possible_words = [] 

with file('wordsEn.txt', 'r') as f: 

    for line in f: 

     if all(x in line + '\n' for x in anagram) and len(line) == len(anagram) + 1: 

      line = line.strip() 
      possible_words.append(line) 

print "\n".join(possible_words) 

それが正常に動作しますが、このような「ハロー」などの言葉のために、出力はこのような「エリオ、全体、穴」、などなどの単語が含まれていソルバは文字 'L'を2つの別個のエントリとして数えていないようです。

私は間違っていますか?私は欠けている簡単な解決策があるように感じる?

ありがとうございます!

+0

あなたのアルゴリズムは単純すぎます。 'anagram'のすべての文字が' line'(これはアナグラムを識別するのには不十分です)にあるかどうかを調べるのではなく、両方の文字列の各文字タイプの数が同じであるかどうかを確認することができます。 – khelwood

+0

'すべて(xはラインで+ 'anagramのxは\ n')'が問題です。単語に "l"があり、アナグラムに100個がある場合、それでも "True"を返すでしょう –

+1

http://stackoverflow.com/questions/39028548/python-scrabble-challenge-find-html-html-html-html-html-japanese.htmlを参照してください。いくつかのアイデアのための有効な単語/ 39028740#39028740 ...(それは事実上同じ問題です) –

答えて

1

あなたのコードは期待どおりです。文字が2回(または3回以上)表示されているかどうかを実際に確認していないので、if 'l' in wordを2回チェックします。少なくとも1つのすべての単語がTrueの場合はlです。

1つの方法は、各単語の文字を数えることです。文字数が等しい場合、それはアナグラムです。これはcollections.Counterクラスで簡単に実現できます。

from collections import Counter 
anagram = raw_input("Enter an Anagram: ").lower() 

with file('wordsEn.txt', 'r') as f: 
    for line in f: 
     line = line.strip() 
     if Counter(anagram) == Counter(line): 
      possible_words.append(line) 

print "\n".join(possible_words) 

もう一つの方法は、他の回答者のコメントでクリスによって示唆されているように、sorted()機能を使用することです。これは、アナグラムとラインの両方の文字をアルファベット順にソートし、一致するかどうかをチェックします。このプロセスは、コレクションメソッドよりも速く実行されます。

anagram = raw_input("Enter an Anagram: ").lower() 

with file('wordsEn.txt', 'r') as f: 
    for line in f: 
     line = line.strip() 
     if sorted(anagram) == sorted(line): 
      possible_words.append(line) 

print "\n".join(possible_words) 
+0

深く私のコードのexplantionと書き直してくれてありがとう。上記のコメントからカウンタメソッドとChris_Randsソートメソッドの両方をテストした結果、ソートされたメソッドが実際に処理が大幅に高速化されていることがわかりましたので、この答えに追加して正しいとマークします。再度、感謝します! – Hexbob6

3

これはおそらくcollections.Counter

>>> from collections import Counter 
>>> Counter('Hello') == Counter('loleH') 
True 
>>> Counter('Hello') == Counter('loleHl') 
False 

を使用して解決するのが最も簡単ですCounterは、各文字が存在することを手紙や回数が同じであることを確認します。

+1

または単に 'ソート( 'Hello')==ソート( 'loleHl')'この答え:http://stackoverflow.com/questions/14990725/checking-strings-against-each-other-anagrams –

+0

ありがとう@mgilsonに返信してください。私はCounterクラスについて聞いたことがありませんでしたが、これは便利な方法のようです。 – Hexbob6

+0

他の答えを正しいものとして選択しましたが、少し詳細がわかりましたが、カウンターモジュールのさまざまなコンソール出力を見ると便利でした。また、@Chris_Randsというレスポンスのおかげで、ソートされたメソッドがコレクションを使うよりもはるかに高速に動作するように見えるので、他の答えを編集しました。 – Hexbob6

関連する問題