2012-04-10 27 views
3

基本的に私はいくつかの文字を取り、それらのすべての組み合わせを取得し、それが実際の単語かどうかを確認するスクリプトをPythonで持っています。同じ言葉私はそれを行うにはしたくない複数回、スクリプトは次のようになります。スクリプトは同じ値を複数回返します

with open("dictionary.txt") as word_file: 
    english_words = set(word.strip().lower() for word in word_file) 

def is_english_word(word): 
    return word.lower() in english_words 

print is_english_word("ham") 
print is_english_word("zz") 

a = raw_input("Please enter first letter: ") 
b = raw_input("Please enter second letter: ") 
c = raw_input("Please enter third letter: ") 
d = raw_input("Please enter fourth letter: ") 
e = raw_input("Please enter fifth letter: ") 

check =[a,b,c,d,e] 

def get_combos(list): 
    import itertools 
    count = len(list) 
    got = [] 
    combos =[] 
    while count > 0: 
     for a in itertools.permutations(list,count): 
      if a in got: 
       got.append(a) 
      else: 
       got.append(a) 
       combos.append(a) 
     count = count - 1 
    for a in combos: 
     strip_combos(a) 

def strip_combos(list): 
    count = '' 
    words = [] 
    for entry in list: 
     count = count + entry 
     words.append(count) 
    check_combo(words) 

def check_combo(list): 
    words = [] 
    got = [] 
    for entry in list: 
     if is_english_word(entry): 
      if entry not in words: 
       print entry 
       words.append(entry) 

get_combos(check) 

今、私はあまりにもそれを意図としては、辞書にあるだけ印刷言葉で動作しますが、それは同じ単語を印刷します例えば、文字が:

a、c、e、s

これはリストに表示されるすべての機会に返されますが、got_and単語リストを持つことによってcheck_comboプロシージャで何度も同じ結果が省略されていることがわかります

私はこの問題は、whileループのget_combosプロシージャのどこかで発生する可能性がありますが、私は役に立たないようにすべてを修正しようとしましたが、私は自分自身よりも知識が豊富な人に助けを求めています。

+0

をいくつかのドキュメンテーション文字列/コメントは役立つかもしれません。 strip_combosが何をすべきかなどは明確ではありません。 – weronika

+1

文字列はすでに反復可能です。それをリストに変換する必要はありません。 'check = raw_input(" 5文字の単語を入力してください: ")' –

答えて

2
 if a in got: 
      got.append(a) 
     else: 
      got.append(a) 
      combos.append(a) 

これは、あなたがあなたがやりたいことは順列からユニークな結果を得るようです:)

何を意味するのか、ほぼ確実ではありません。あなたはこれをあまりにも複雑にしていますし、同じ時間に遅くなっています(検索のためのデータ構造としてlistを使用しているためです)。

具体的には、ユニークな物のコレクションの数学的な概念のように、の結果がのセットになります。幸運なことに、Pythonにはこれが組み込まれています。

本当にあなたは全体の問題を複雑にしていますが、インターフェイスが間違っています。最も内側のレベルではなく、最も外側の(結果がreturnの適切なデータの後に)結果がprintであるべきではありません。手動でデータのリストを処理するにはあまりにも多くの作業をしているので、必要以上のレベルがあります。必要なデータを記述するだけです。タイルから作成できる「単語」のセットと、実際には辞書にある単語との共通部分です。前者は、いくつかのitertools.permutationsイテレータから得た文字組み合わせの文字を結合した結果のセットです。これはitertools.chainと一緒に文字列にすることができます。

def get_combos(letters): 
    return set(
     ''.join(x) 
     for x in itertools.chain(*(
      itertools.permutations(letters, count) 
      for count in range(len(letters)) 
     )) 
    ).intersection(english_words) 

完了。

それともあなたが行くように、あなたはセットをフィルタリングすることができます。

def get_combos(letters): 
    return set(
     ''.join(x) 
     for x in itertools.chain(*(
      itertools.permutations(letters, count) 
      for count in range(len(letters)) 
     )) 
     if is_english_word(''.join(x)) 
    ) 
+0

すばらしく、多くのおかげでやさいこのトリックでした! リストに別の要素を追加して、アナグラムが余分な文字であるかどうかを確認する方法があるのだろうか?たとえば、A、C、Eという3文字の文字がある場合、余分な手紙でACEDまたはACESを使用できることが示されます。 – Coombes

+0

A、C、Eと空白で単語を作ることができれば、A、C、Eで(削除された文字を含む単語)を作ることができます。それを確認してください。 –

0

この小さなシーケンスは間違って見える:あなたは本当に関係なく、選択された枝のagotにを追加したいならば

 if a in got: 
      got.append(a) 
     else: 
      got.append(a) 
      # .... 

ifブロックの外でそれを行います。

関連する問題