2016-12-06 54 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