2016-12-15 5 views
1

私は基本的には、Pythonの3.xの中で、私はセットをとる関数(best_words(ltr_set,word_file))を定義しなければなりません...与えられた文字セットで形成できる単語のファイルをチェックしてください:strange result?

のpythonに非常に新たなんだと確実に起因する私の部分の基本的なエラーに、いくつかの奇妙な結果を取得しています(文字のリスト)を検索し、それらの文字で形成できる単語の.txtファイル(1行に1語)を検索します。

私は最初に与えられた単語が与えられた文字の組から作ることができるかどうかを調べる関数を定義しました。それは(LSTB)可能な文字セットと照合することができますので、チェックする語は、文字(lsta)のリストとしてこの関数に供給されなければならない:

def can_make_lsta_wrd_frm_lstb(lsta,lstb): 
    result = True 
    i = 0 
    while i < len(lsta) and result == True: 
     if lsta[i] in lstb: 
      lstb.remove(lsta[i]) 
      i+=1 
     else: 
      result = False 
    return result 

私はまた、いずれかを取る関数を定義しました文字列を与えられ、それの文字のリストに変換:

def lst(string): 
    ls = [] 
    for c in string: 
     ls.append(c) 
    return ls 

メインbest_words機能の背後にある考え方はして、文字の特定のセットを取り、言葉のファイル内のすべての行に上記の関数を適用することです利用可能な文字から作成できるものだけにフィルタリングするという目的です。

私は、次の言葉で、ファイルshort_dictionnary.txtを取る場合は10
def best_words(ltr_set, word_file): 

    possible_words = [] 

    f = open(word_file) 
    lines = f.readlines() 

    i = 0 
    while i < len(lines): 
     lines[i] = lines[i].strip('\n') 
     i+=1 

    for item in lines: 
     if can_make_lsta_wrd_frm_lstb(lst(item),ltr_set): 
      possible_words.append(item) 

    return possible_words 

はしかし、私は、それがあるべきように、ループが継続されていないかのように例えば

...、予期しない結果を得続ける:

AA 
AAS 
ABACA 
ABACAS 
ABACOST 
ABACOSTS 
ABACULE 
ABACULES 
ABAISSA 
ABAISSABLE 

や関数を呼び出す:

best_words([‘A’,’C’,’B’,’A’,’S’,’A’], “short_dictionnary.txt”) 

possible_wordsリストは、単に「AA」から構成されている... AAS、アバカとABACASもfとすることができながら、 ormed ...

誰かが何が起こっているかを見ることができれば、彼らの入力は非常に高く評価される!

+0

あなたを」 'lstb'を渡し、' lstb.remove'を呼び出すと、 'can_make ... 'の中のリストは' letter_set'と同じリストになります。 'lstb.remove'を呼び出すたびに' letter_set'を縮小します。 –

+0

'lstb.remove(lsta [i])'で文字のリストを変更しています。したがって、次回に関数を呼び出すと、前の単語のすべての文字が欠落しています。 – Barmar

+0

また、リストを渡しているにもかかわらず、一連の文字を渡す必要があると指定しました。違いがあります。 –

答えて

0

私はCounterに変換し、可能な単語の各文字については、letter_setにその文字があることを確認してください。また、ファイル参照が漏れています。

from collections import Counter 

def can_make_word(c, word): 
    return all(c[letter]>=count for letter, count in Counter(word).most_common()) 

def best_words(ltr_set, word_file): 

    possible_words = [] 
    c = Counter(ltr_set) 

    with open(word_file) as f: 
     lines = f.readlines() 

    lines = [line.strip() for line in lines] 

    for item in lines: 
     if can_make_word(c, item): 
      possible_words.append(item) 

    return possible_words 
+0

ありがとう、それはいい提案です! –

0

皆さん、ありがとうございました。

元のltr_setが変更されていないことを確認する必要がありました。これは単純なコピーを作成することで実現しました。誰でも同様の問題を解決するために、それが役に立つはずです自分の質問に答えることは任意の使用である場合、私は(私はこのフォーラムにはかなり新しいです)分かりませんが、ここに訂正さcan_make...機能があります:

def can_make_lsta_wrd_frm_lstb(lsta,lstb): 
    lstb_copy = lstb[:] 
    result = True 
    i = 0 
    while i < len(lsta) and result == True: 
     if lsta[i] in lstb_copy: 
      lstb_copy.remove(lsta[i]) 
      i+=1 
     else: 
      result = False 
    return result 
関連する問題