【问题标题】:Frequency analysis issues with tuple error元组错误的频率分析问题
【发布时间】:2015-04-23 13:31:27
【问题描述】:

在 match_letters 函数中,使用 'place = string.index(letter)' 我不断收到相同的错误 'Value Error: tuple.index(x): x not a tuple。有谁知道如何解决这个问题?将不胜感激:) 谢谢

def freq_analysis():
""" Summary:    Perform a frequency analysis on a string
    Paramaters: text - The text to analyse
    Returns:    A string containing the deciphered text
"""
    text = input("enter text")
    letterCount = getLetterCount(text)


    Letter_Count_Tuple,new_letter_count,descending = descending_order(letterCount)
    ETAOIN = "ETAOINSHRDLCUMWFGYPBVKJXQZ"
    string = descending_order(letterCount)
    finish = match_letters(ETAOIN, string,text)

def getLetterCount(text):
    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 text.upper():
        if letter in letterCount:
            letterCount[letter] += 1

    print("Letter count is",letterCount)
    return letterCount

def descending_order(letterCount):
    Letter_Count_Tuple = letterCount.items()
    new_letter_Count = sorted(Letter_Count_Tuple, key = get_number)
    print("new letter count is",new_letter_Count)
    descending = new_letter_Count[::-1]
    print("descending is",descending)
    string = ""
    for le in descending:
        string = string + le[0]

    print("String is",string)
    return Letter_Count_Tuple, new_letter_Count, string

def get_number(Letter_Count_Tuple):
    return Letter_Count_Tuple[1]

def match_letters(ETAOIN,string,text):

# loop over each leter in the encrypted text
    # find the position of that letter in your observed descending order string
    # replace it with the letter in the same position from the etaoin descending order string
    finish = ""
    for letter in text:
     place = string.index(letter)
     ETAOIN_place = ETAOIN[place]
     for le in ETAOIN_place:
        finish = finish + le
     print(finish)

频率分析()

Traceback:
Message File Name       Line    Position       
Traceback                              
    <module>    <module1>       54             
    freq_analysis       <module1>       13             
    match_letters       <module1>       47             
ValueError: tuple.index(x): x not in tuple

【问题讨论】:

  • 你能复制/粘贴完整的回溯吗?
  • 这里有一个指向 pastebin 的链接,因为它不能很好地粘贴,谢谢 :)pastebin.com/SCTnXube
  • 只需使用正确的格式将其添加到您的问题中......这将使其更具可读性
  • 你也应该修复你正在显示的代码中的缩进
  • 完成 :) 感谢您的提示

标签: python encryption tuples frequency frequency-analysis


【解决方案1】:

您在此处传递给 ma​​tch_letters 的变量 string

string = descending_order(letterCount)
finish = match_letters(ETAOIN, string,text)

不是真正的字符串(或列表),它是来自 descending_order 的元组:

return Letter_Count_Tuple, new_letter_Count, string

要么只返回 descending_order 中的字符串,要么从返回的元组中正确提取:

_,_,string = descending_order(letterCount)

(我假设 descending_order 中的 string 是您在 ma​​tch_letters 中想要的那个)

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2012-04-19
    相关资源
    最近更新 更多