我目前正在编写一个代码,我想计算在密文中使用的字母的频率,然后将其与ETAOINSHRDLCUMWFGYPBVKJXQZ
进行比较。然后,我希望它提供解密时使用的密钥,但是我无法从当前编码获得输出。我试图创建一个caeser密码的频率分析,但我似乎无法得到一个输出
englishLetterFreq = {'E', 'T', 'A', 'O', 'I', 'N', 'S', 'H', 'R', 'D', 'L', 'C', 'U', 'M', 'W', 'F', 'G', 'Y', 'P', 'B', 'V', 'K', 'J', 'X', 'Q', 'Z'}
ETAOIN = 'ETAOINSHRDLCUMWFGYPBVKJXQZ'
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def getLetterCount(message):
letterCount = {'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 letter in message.upper():
if letter in LETTERS:
letterCount[letter] +=1
print('LETTERS {}'.format(letterCount))
return letterCount
def getItemAtIndexZero(x):
return x[0]
def getFrequencyOrder(message):
letterToFreq = getLetterCount(message)
letterToFreq = {}
for letter in LETTERS:
if letterToFreq[letter] not in freqToletter:
freqToLetter[letterToFreq[letter]] = [letter]
else:
freqToLetter[letterToFreq[letter]].append(letter)
for freq in freqToLetter:
freqToLetter[freq].sort(key=ETAOIN.find, reverse=True)
freqToLetter[freq] = ".join(freqToLetter[freq])"
freqPairs = list(freqToLetter.items())
freqPairs.sort(key=getItemAtIndexZero, reverse=True)
freqOrder = []
for freqPair in freqPairs:
freqOrder.append(freqPair[1])
return".join(freqOrder)"
def englishFreqMatchScore(message):
freqOrder = getFrequencyOrder(message)
matchScore = 0
for commonLetter in ETAOIN[:6]:
if commonLetter in freqOrder[:6]:
matchScore += 1
for uncommonLetter in ETAOIN[-6:]:
if uncommonLetter in freqOrder[-6:]:
matchScore += 1
print("{}",englsishFreqMatchScore)
return matchScore
您的代码格式出错了。请参阅[Markdown帮助 - 代码和预格式化文本](http://stackoverflow.com/editing-help#code)和[编辑]您的文章。 – Kevin
一般说明。这是稍微先进的,但看看https://docs.python.org/2/library/collections.html#collections.Counter这将为您节省很多时间,并在将来用这种类型的任务 –
为什么要在下面一行覆盖它时调用getLetterCount – Navidad20