2016-05-31 3 views
1

たとえば、次のように多くの単語を検索しようとしています。 'workbook' 結果はwork、workbook、bookwork、bookwork、bow、rowなどのようになります。注文が異なる場合でも文字列内の単語をチェックする方法 - PYTHON

これは私が試した1つの方法ですが、これは異なる順序で綴られた単語は見つかりません。 (例えば、それはあなたが「弓」を書くために「ワークブック」内の文字を並べ替えることができていても「弓」を追加しません)

f = open('/usr/share/dict/words', 'r') 

test = "workbook" 
anagramlist = [] 

for word in f: 
    if word[:-1] in test and len(word[:-1]) > 2: 
     anagramlist.append(word[:-1]) 
     # this wont append 'bookwork', 'row' etc 

print anagramlist #outputs ['boo', 'book', 'work', 'workbook'] 

私はこの問題にアプローチしようとしたもう一つの方法は、セットを使用することです..しかし、これは」doesnのトンの仕事完全にどちらかそれは例えばのために持っている単語を追加するため、1以上WOW 『や『wowwow』、私が唯一で文字と文字の数を使用することを望んでいても『ワークブック』

f = open('/usr/share/dict/words', 'r') 
test = "workbook" 
anagramlist = [] 

for word in f: 
    if len(word) > 2 and set(word[:-1]) == set(test) & set(word[:-1]): 
     anagramlist.append(word[:-1]) 

print anagramlist 
「のようだW』

この出力はです。私はこの状態で何かを修正できることを望んでいる、あるいはこれはまったく間違ったアプローチです。

['bo', 'bob', 'bobo', 'boo', 'boob', 'boobook', 'book', 'bookwork', 'boor', 'bor', 'boro', 'borrow', 'bow', 'bowk', 'bowwow', 'brob', 'broo', 'brook', 'brow', 'ko', 'kob', 'koko', 'kor', 'or', 'orb', 'ow', 'owk', 'rob', 'rook', 'row', 'wo', 'wob', 'woo', 'work', 'workbook', 'wow', 'wro'] 

本当にありがとうございます。

+0

私はあなたが別のアプローチを探しているので、それが今立っているとして、あなたの質問が広すぎると思います。ただし、いくつか試してみることもできます。まず、入力文字列を再配置するための['itertools.permutations'](https://docs.python.org/2/library/itertools.html#itertools.permutations)のようなものをチェックしてください。次に、それらをあなたの辞書と比較して(どちらかと言えば)、実際の単語 "HTH"を見つけてください。 –

答えて

1

また、辞書の単語の各文字について、それが"workbook"よりも辞書の単語に多く表示されないことをテストする必要があります。たとえば、count()の方法を使用してこれを行うことができます。str

もちろん、他の方法もありますが、最終的には効率が良いかもしれませんが、自分が持っているものを修正するために最初から始める必要はありません。

2

すべての単語の順列を計算し、すべての可能なアナグラムの長さにわたって繰り返して、すべての潜在的なアナグラムを生成します。次にwordsファイルfに従ってpotential_anagramsをフィルタリングします。

import itertools 

def compute_anagrams(word) 
    n = len(word) + 1 
    permutations = {''.join(p) for p in itertools.permutations(word)} 
    potential_anagrams = {p[:i] for i in range(n) for p in permutations} 
    return [anagram for anagram in potential_anagrams if anagram in f] 

Deomonstration:

>>> f = ['book', 'bookwork', 'bow', 'row', 'work', 'workbook'] 
>>> word = 'workbook' 
>>> compute_anagrams(words) 
['work', 'bow', 'workbook', 'row', 'bookwork', 'book'] 
+1

'math.factorial(len(word))'が 'len(f)'より大きいオーダーである場合、このアルゴリズムは失敗しますので、最初にサイズをチェックする価値があります。 「ワークブック」は上手く、「国際化」はそれほどではない。 –

関連する問題