2016-12-06 69 views
1

我想創建一個凱撒Cypher函數,當給定一個輸入文件的程序(通過命令行)分析文件找出每個字母(大寫和小寫)有多少是當下。從那裏我可以找出解密文件的密鑰。Python凱撒Cypher分析輸入文件

我遇到的問題是拉最常見的字母,然後我可以將其轉換成密鑰。

我下面的代碼遠沒有完成。我一直在試圖找到一種方式來拉動最常見的信件。從那裏我相信使用已經使用的代碼的變體,我將能夠轉換和使用一個數字作爲一個關鍵。我真的只需要一個關於如何獲得初始角色的指針。

此代碼是不是已經被用於分析該文件,並存儲在詞典的結果的完整的程序,只有代碼:

elif fileOption == "2": 
def decryptChars(aString): 
    "Function to count characters in the input file" 
    charCount = {} 
    for char in aString: 
     if char in charCount.isalpha(): 
      if char in charCount: 
       charCount[char] = charCount[char] + 1 
      else: 
       charCount[char] = 1 
     return charCount 

try: 
    inputFile = open(sys.argv[1], "r") 
except: 
    sys.exit("The file {} could not be opened...".format(sys.argv[1])) 

totalChars = inputFile.read().replace(" ", "") 

charCount = decryptChars(totalChars) 
print(sorted(charCount.items())) 

當我傳遞一個文件以字符串「而不是要求所有需要的功能被內置到語言的核心」我得到的結果是:

[('R', 1), ('a', 6), ('b', 2), ('c', 2), ('d', 2), ('e', 9), ('f', 1), ('g', 3), ('h', 4), ('i', 7), ('l', 5), ('n', 6), ('o', 4), ('q', 1), ('r', 5), ('s', 2), ('t', 9), ('u', 4), ('y', 1)] 

(我不知道最好的試片,因爲它會返回2 9 ...)。

任何建議將非常有幫助。

+1

讓我明白這一點。考慮到你在問題結尾顯示的元組列表,這是一個字母頻率對列表,你想選擇最頻繁的字母? – user3030010

+0

結果似乎很好,除了它認爲'R'和'r'爲2個不同的字符。這是唯一的問題嗎? – lucasnadalutti

+0

@ user3030010正確。我需要確定最頻繁的字母,然後將其用作關鍵字。我無法找到一種方法來自動獲取最frequesnt鍵。 – Romark14

回答

0

假設的最簡單方法:

charCount = {'R': 1, 'a': 6, 'b': 2...} 

這裏有一個單線以獲得最多發生的字符:

max(charCount, key=charCount.get) 
+0

謝謝你,看起來正是我需要的東西。 如果字典名稱與charCount字典相同,那麼您有'sample'的位置?或者我需要重新定義它? – Romark14

+0

對不起,我錯過了這個元組列表實際上是你的'sorted(charCount.items())'的結果。請參閱更新的答案,它更簡單。 – lucasnadalutti

+0

謝謝你。我已經實現了這一點,它似乎運行沒有錯誤。雖然我無法調用密鑰(例如,當我嘗試打印密鑰時說它沒有被定義)。我認爲'... key = charCount.get ...'定義了密鑰。 – Romark14

0

好吧,給你的列表,其中包含對:

l = [('R', 1), ('a', 6), ...] 

做到這將是一個for循環

char = '' 
freq = 0 
for new_char, new_freq in l: 
    if new_freq > freq: 
     freq = new_freq 
     char = new_char