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

リストに表示されるたびに返されますが、check_comboプロシージャで何度も発生する同じ結果を、gotとwordsのリストを使用することで省略していることがわかります。

この問題は、whileループのget_combosプロシージャが原因である可能性があると感じていますが、ほとんどすべてを無駄に変更しようとしたので、自分よりも知識のある人に助けを求めています。

4

2 に答える 2

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

これはほぼ間違いなくあなたが意図したものではありません:)

あなたがやりたいのは、順列からユニークな結果を得ることだと思われます。これを非常に複雑にし、同時に遅くしています(listルックアップのデータ構造としてを使用しているため)。

具体的には、ユニークなもののコレクションの数学的概念のように、一連の結果が必要です。幸いなことに、Pythonにはこれが組み込まれています。

ただし、実際には問題全体が複雑になりすぎており、インターフェイスが間違っています。print最も内側のレベルではなく、最も外側のレベルで結果を表示する必要があります(return適切なデータを取得した後)。必要以上のレベルがありますが、データのリストを手動で処理するには多くの作業を行っているためです。必要なデータを説明するだけです。タイルから作成できる一連の「単語」と、実際に辞書にある単語との共通部分です。前者は、複数のイテレータから取得した文字の組み合わせからの文字を結合した結果のセットであり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))
    )
于 2012-04-10T01:22:47.353 に答える
0

この小さなシーケンスは間違っているように見えます:

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

a選択したブランチに関係なく、本当に追加したい場合は、ブロックgotの外側で追加してください。if

于 2012-04-10T01:05:59.277 に答える