2014-11-08 57 views
0

我的代碼如何讓我的python解密代碼更有效率?

from itertools import permutations 

original = str(input('What word would you like to unscramble?: ')) 

gen = [] 
for bob in permutations(original): 
    gen.append(''.join(bob)) 



inputFile = open('dic.txt', 'r') 
compare = inputFile.read().split('\n') 
inputFile.close() 

rondo = set(john for john in gen if john in compare) 

for magic in rondo: 
    print(magic) 

我用它找到一個單詞的所有可能的排列和每個排列比較字典來找到真正的單詞,然後返回那些真正的詞來解讀的話。然而,在程序結束之前,超過八個字母會導致錯誤,因爲我用完了內存,而帶有七個或八個字母的單詞需要很長時間才能解密。我想知道是否有辦法讓我的代碼能夠以更長的單詞運行得更快,並且可以增加最大字長。我使用的是Python 3,如果它很重要,那麼它就是一個初學者。

回答

2

而不是將所有的排列附加到列表,你應該直接迭代它們。

set(''.join(john) for john in permutations(original) if ''.join(john) in compare) 

set(john for john in (''.join(bob) for bob in permutations(original)) if john in compare) 

找到的解決辦法是通過創建從信的地圖計數或通過排序的字母來創建字簽名的更好的方法。然後,您只需要將加密的單詞的簽名與單詞列表中的簽名進行比較。

words = {} 
for word in compare: 
    key = ''.join(sorted(word)) 
    if key in words: 
     words[key].add(word) 
    else: 
     words[key] = {word} 

return words[''.join(sorted(original))] 
+0

謝謝!我明白你在說什麼,但是你可能請給我一個示範,因爲我不完全知道如何做到這一點。 – TimeWillTell 2014-11-08 16:14:49

+1

您可以按照以下方式對字母進行排序來製作簽名。掃描當前每行包含一個單詞的詞典文件,並創建一個新文件,每行包含兩個單詞:原始單詞包含按字母順序排序的字母,後跟原始單詞。然後,解開一個單詞,只需對它進行排序,然後在新文件中搜索排序後的版本。您可以將新雙字列表作爲Python'dict'存儲在內存中,其中排序字爲鍵,原始版本爲值。如果沒有,您可以使用二分法快速搜索排序文件。 – 2014-11-08 16:44:04

+0

這很好,但我仍然建議問題的提問者理解並利用代碼中的生成器,按照我的答案。 – 2014-11-09 11:40:52