3

私は一連のパズルを持っています:文字や単語の間にスペースのないモールス信号の文字列。私の計画は、辞書攻撃を行って最適なソリューション候補を見つけることです。私の武器はPythonです。

私は17000の英語の単語のリストを持っています。また、パズルのテーマに関連する単語のリストははるかに少なく、それらの単語が表示された場合は、スコアが高くなるはずです。

したがって、スクリプトの最初で単語のリストを生成するときに、形式のタプルのリスト(word、scoremultiplier)を使用します。これが小さなサブセットです:

[('zoned', 1.0), 
 ('zonely', 1.0), 
 ('zoner', 1.0), 
 ('zones', 1.0), 
 ('zoning', 1.0), 
 ('zoo', 1.0), 
 ('zoom', 1.0), 
 ('zoomed', 1.0), 
 ('zooming', 1.0), 
 ('zooms', 1.0), 
 ('zoos', 1.0), 
 ('ten', 1.0), 
 ('tens', 1.0), 
 ('gnash', 1.0), 
 ('shag', 1.0), 
 ('75th', 2.0), 
 ('seventy', 2.0), 
 ('fifth', 2.0)]

私がすべてを解析したファイルでは、ファイルの主要部分の重複を手動で削除せずに、最後に価値の高い単語を貼り付けたいだけです。したがって、最初の値が後のタプルの値と等しい初期のタプルを取り除くために何かを書く必要があります。

私はブルートフォースでこれを行うことができます:

for firstkey, (firstword, firstfactor) in enumerate(wordlist):
    for laterkey, (laterword, laterfactor) in enumerate(wordlist[firstkey+1:]):
        if firstword == laterword:
            del wordlist[firstkey]
            break

しかし、スクリプトのその部分だけでも45秒近くかかり、私の17000語は完全な辞書ではありません。(このコードは、終了するまでの時間以外はテストされていないため、機能しない可能性もあります。)また、Pythonを学んでいるところですが(そして最初のプログラミングの一部を行っているだけですが)、Pythonが非常に悪いようです。このプロジェクトで。

これを行うためのより良い方法はありますか?set()重複する単語は等しくないタプルの一部であるため、使用できません。どういうわけかデータを再構築する必要がありますか?それとも、これを実行するたびに1分待つ準備をする必要がありますか?

4

1 に答える 1

3

dict質問を誤解しているかもしれませんが、タプルのリストからを生成できるようです。後の値は、前の値を自動的に上書きします。

lst = [
    ('foo', 1),
    ('bar', 2),
    ('foo', 10)
]

print dict(lst) # {'foo': 10, 'bar': 2}
于 2012-10-14T21:21:32.503 に答える