3

私の質問は、定義した単語リスト内の単語を word_list.txt ファイル全体でより高速に検索できるように、このコードを改善できるかどうかです。ファイルを適切なデータ構造に配置することで、14 ワードすべてに対してファイルを 1 回反復することで、これを行う方法があると言われています。

word_list = ['serve','rival','lovely','caveat','devote',\
         'irving','livery','selves','latvian','saviour',\
         'observe','octavian','dovetail','Levantine']

def sorted_word(word):
    """This return the sorted word"""
    list_chars = list(word)
    list_chars.sort()
    word_sort = ''.join(list_chars)
    return word_sort

print("Please wait for a few moment...")
print()

#Create a empty dictionary to store our word and the anagrams
dictionary = {}
for words in word_list:
    value = [] #Create an empty list for values for the key
    individual_word_string = words.lower()

    for word in open ('word_list.txt'):
        word1 = word.strip().lower() #Use for comparing

        #When sorted words are the same, update the dictionary        
        if sorted_word(individual_word_string) == sorted_word(word1):
            if word1[0] == 'v':
                value.append(word.strip()) #Print original word in word_list
                tempDict = {individual_word_string:value}
                dictionary.update(tempDict)

#Print dictionary
for key,value in dictionary.items():
    print("{:<10} = {:<}".format(key,value))

新規ユーザー制限のため、結果の画像を投稿できませんでした。ちなみに、結果は単語ごとに v で始まるアナグラムを出力するはずです。このコードを改善するための助けをいただければ幸いです。

4

1 に答える 1

0

十分なメモリがある場合は、値を辞書に格納してから、それに対してハッシュ検索を実行できます (非常に高速です)。これの良いところは、後で再び使用するために pickle できることです (辞書作成のプロセスは遅く、ルックアップは高速です)。map reduce を使用したい非常に大きなデータセットがある場合は、disco-project をお勧めします。素晴らしい python/erlang フレームワークです。

word_list = ['serve','rival','lovely','caveat','devote',\
         'irving','livery','selves','latvian','saviour',\
         'observe','octavian','dovetail','Levantine']

print("Please wait for a few moment...")
print()

anagrams = {}

for word in open ('word_list.txt'):
    word = word.strip().lower() #Use for comparing
    key = tuple(sorted(word))
    anagrams[key] = anagrams.get(key,[]) + [word]

for word in word_list:
    print "%s -> %s" % (word.lower(),aragrams[tuple(sorted(word.lower()))])
于 2012-10-19T10:48:16.837 に答える