2017-02-25 9 views
1

私は学校のための単純なPythonプロジェクトをやっています。 30秒で手紙。ユーザーの回答が本当の単語であるかどうかをテストするには、英語で多くの単語のファイル(おそらくすべてが含まれていない114,000語の単語)を繰り返してテストするだけです。実際には、それは実行するためにスプリット秒を要した。ファイルリストをループし、各単語を1文字の9文字の単語ごとにテストします。

しかし、ランダムな文字のプールに完全な '解決法'(9文字の実数)があるかどうかを調べるために、9文字の単一置換のテストごとに何かを考えることはできませんでした。ファイル内のすべての単語に対してレターワードプールを作成します。問題は、それは本当に非効率的で約7分かかったことです。結局のところ、9があることを考慮して! (階乗)順列であり、 'ランダム'モジュールは以前の順列を除外せず、ファイル内に多くの単語があるとすれば、コンピュータは500億回以上の比較を経なければならない。最後に「幸福」のアナグラムを使った言葉が見つかりませんでした。これは私が試したコードです:

別に、実際にソリューションを生み出すコードから
# python 3.5.2 

import random 

anagram = ['p','s','h','a','i','s','n','p','e'] # anagram of hapiness 


with open('wordlist.txt') as in_file: 
    for line in in_file: 
    line = line.rstrip() 
    shuffledList = random.sample(anagram, len(anagram)) # randomise order 
    shuffledWord = ''.join(shuffledList) # make it a string 
    if shuffledWord == line: 
     print("YES") # (never happens) 
     break 

、私は9の元の単語を見つけることができる巧妙なアルゴリズム・ソリューション/スレッディング技術/絶対に何も、いくつかの並べ替えを探しています30秒以内にアナグラムを送ってください。それは本当に遠くに見えるが、私はそれが試してみる価値があると思った。助言がありますか?

+0

: あなたはそのような何かを試すことができます。 OTOH、itertools.permutationsは、反復項目を含むコレクションを置換するときに少しダムです。その状況を適切に処理するには、http://stackoverflow.com/a/31678111/4014959 –

答えて

2

ここでは、アナグラムを少し手掛かりにしています。並べ替えた後は同じリストになります。あなたのアナグラムの質問への答えを持っていますが、今後の参考のために、itertoolsモジュールは、ランダムシャッフルでこれをやろうとしてよりはましだすべての順列を生成するための効率的な機能を持っている

>>> def is_anagram(word_one, word_two): 
...  return sorted(word_one) == sorted(word_two) 
... 
>>> print(is_anagram('ranagam', 'anagram')) 
True 
+0

を参照してください。どの単語ペアでもtrueを返さないのですか?私はprint(is_anagram( 'pine'、 'tree'))を試したときに出力が "True"になっています。 –

+1

@LauraCooksonそうですね、 '.sort()'は 'None'と' None' = 'None'を返さないので常にtrueを返します。あなたが必要とするのは、 'sorted(word_one)'です。 – hashcode55

+0

@ hashcode55そうです。ありがとう –

関連する問題