2015-04-17 82 views
0

基本上,我已經分配了一個任務來計算字母中的每個字母在加密的文本中出現的次數。 一旦完成,每個字母的頻率按降序排列。例如[(1,2),(e,1),{h,1),(o:1)]。 這我已經完成,它的工作原理。頻率分析幫助

然後降序列表中的每個字母都需要用此字符串中的匹配字母替換:'etaoinshrdlcumfwgypbvkjxqz' 這是我不知道該怎麼做的。

到目前爲止,我有這樣的:

enc_text = input("Enter Encrypted Text: ").lower() 

count = {'a':0, 'b':0, 'c':0, 'd':0, 'e':0, 'f':0, 'g':0, 'h':0, 'i':0, 'j':0, 'k':0, 'l':0, 'm':0, 'n':0, 'o':0, 'p':0, 'q':0, 'r':0, 's':0, 't':0, 'u':0, 'v':0, 'w':0, 'x':0, 'y':0, 'z':0} 

for char in enc_text: 
if char.isalpha(): 
    count[char] += 1 

print(enc_text) 
print(count) 

def get_value(count): 
    return count[1] 


sorted_text = sorted(count.items(), key = get_value) 


descending_text = reversed(sorted_text) 
descending_text = list(descending_text) 
print(descending_text) 


most_frequent = {'e': 1, 't': 2, 'a': 3, 'o': 4, 'i': 5, 'n': 6, 's': 7, 'h': 8, 'r': 9, 'd': 10, 'l': 11, 'c': 12, 'u': 13, 'm': 14, 'w': 15, 'f': 16, 'g': 17, 'y': 18, 'p': 19, 'b': 20, 'v': 21, 'k': 22, 'j': 23, 'x': 24, 'q': 25, 'z': 26} 


letters = list('abcdefghijklmnopqrstuvwxyz') 
etaoin = list('etaoinshrdlcumfwgypbvkjxqz') 

我相信我有遍歷在開始的文本,並通過信件看看它的信。那麼每個字母應該被字符串中的字母替換?但我不知道如何實現它。

預先感謝任何幫助

+0

對於一些有趣的例子和庫支持,你可能想看看這裏:https://docs.python.org/2/library/collections.html#collections.Counter – Pynchia

+0

你解決了你的問題?會很高興聽到解決方案:) – Mailerdaimon

回答

0

你冷循環遍歷加密後的文本,並期待在使用list.index()降列表中的角色,並在從etaoin列表這個位置得到相應的字符。

樣品:

decryptedChar = eatoin[descending.index(encryptedChar)] 
0

除了使用了不同的庫,你有大部分所做的工作。只需根據頻率創建映射,然後將加密文本中的每個字母替換爲相應的映射值。

decryption_map = {} 
for index, key in enumerate(sorted(count.items(), key = get_value)): 
    decryption_map[key] = etaoin[index] 
print ''.join(map(lambda x : decryption_map[key], list(enc_text))) 
0

這會給你更換地圖。從代碼的最後一部分繼續(由etaoin字符串):

etaoin = "etaoinshrdlcumfwgypbvkjxqz" 

rev_etaoin = etaoin[::-1] 
replacement_map = sorted_text[:] 
for i in range(26): 
    replacement_map[i] = (sorted_text[i][0],rev_etaoin[i]) 
print(replacement_map) 

輸出:

[('c', 'z'), ('b', 'q'), ('e', 'x'), ('g', 'j'), ('f', 'k'), ('i', 'v'), ('k', 'b'), ('m', 'p'), ('l', 'y'), ('o', 'g'), ('n', 'w'), ('p', 'f'), ('u', 'm'), ('t', 'u'), ('w', 'c'), ('v', 'l'), ('x', 'd'), ('z', 'r'), ('h', 'h'), ('q', 's'), ('r', 'n'), ('y', 'i'), ('j', 'o'), ('s', 'a'), ('d', 't'), ('a', 'e')] 
0

您已經保存到字典中的字母數。如何將排名字母保存到字典中,將字母作爲關鍵字並將其排序爲值。

rank_dict = {} 
for i in range(26): 
    rank_dict[sorted(count, key=count.get, reverse = True)[i]] = i+1 
print rank_dict 

所以[(1,2),(E,1),{H,1),(○:1)]將改爲rank_dict = { 'L':1 :, 'E': 2,'h':3,'o':4}。 如果再有最常見的字典反過來

freq_dict = {1: 'e', 2: 't', 3: 'a', 4: 'o', 5: 'i', 6: 'n', 7: 's', 8: 'h', 9: 'r', 10: 'd', 11: 'l', 12: 'c', 13: 'u', 14: 'm', 15: 'f', 16: 'w', 17: 'g', 18: 'y', 19: 'p', 20: 'b', 21: 'v', 22: 'k', 23: 'j', 24: 'x', 25: 'q', 26: 'z'} 

,那麼你可以通過與加密文本循環:

dec_text = '' 
for char in enc_text: 
    dec_text = dec_text + freq_dict[rank_dict[char]] 

另外,如果你想保持你的most_frequent字典鍵:值輪目前的方式,使用方法:

dec_text = dec_text + [key for key in most_frequent \ 
         if most_frequent[key] == rank_dict[char]] 

注意,其中多個字母用相同的頻率出現的情況是按字母順序暫時排名按排序/排序。如果你的文本很長,而且你只是用它作爲解密替換密碼的指南 - 但是解密文本中可能會出現錯誤。