Python 尝试加密/解密时出现vigenere密码错误

Python 尝试加密/解密时出现vigenere密码错误,python,python-2.7,vigenere,Python,Python 2.7,Vigenere,我在运行程序时遇到以下错误: Traceback (most recent call last): File "C:/Users/####/PycharmProjects/hw5/Homework5_Cepero.py", line 112, in <module> decrypt() File "C:/Users/####/PycharmProjects/hw5/Homework5_Cepero.py", line 78, in decrypt encrypted.append({

我在运行程序时遇到以下错误:

Traceback (most recent call last):
File "C:/Users/####/PycharmProjects/hw5/Homework5_Cepero.py", line 112, in <module>
decrypt()
File "C:/Users/####/PycharmProjects/hw5/Homework5_Cepero.py", line 78, in decrypt
encrypted.append({stringlist[i] - keylist[i]} % 29)
TypeError: list indices must be integers, not str

Process finished with exit code 1
回溯(最近一次呼叫最后一次):
文件“C:/Users/######/PycharmProjects/hw5/Homework5_Cepero.py”,第112行,在
解密()
文件“C:/Users/######/PycharmProjects/hw5/Homework5_Cepero.py”,第78行,在decrypt中
加密的.append({stringlist[i]-keylist[i]}%29)
TypeError:列表索引必须是整数,而不是str
进程已完成,退出代码为1
代码如下:

Alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",
        "V", "W", "X", "Y", "Z", ",", ".", "-"]

def encrypt():
    count = 0
    i = 0
    output = []
    encrypted = []
    keylist = []
    stringlist = []
    string = raw_input("Please enter a string to encrypt: ")
    string = string.replace(' ', '')
    key = raw_input("Please enter the key you'd like to use: ")
    keylength = len(key)
    stringlength = len(string)
    overlap = stringlength % keylength
    leftovers = key[:overlap]
    random = stringlength - overlap
    random = stringlength / keylength
    key = (int(random) * key) + leftovers

    #convert Key to uppercase
    for i in key:
        number = Alphabet.index(i.upper())
        keylist.append(number)
    #convert String to uppercase
    for i in string:
        number = Alphabet.index(i.upper())
        stringlist.append(number)

    while count < stringlength:
            encrypted.append((stringlist[i] + keylist[i]) % 29)
            count += 1
            i += 1
    for N in encrypted:
        output.append(Alphabet[N])

    string = ''.join(output)
    print" "
    print"Output:"
    print" "
    print "The encoded text is:", string
    print" "


def decrypt():
    count = 0
    i = 0
    output = []
    encrypted = []
    keylist = []
    stringlist = []
    string = raw_input("Please enter a string to decrypt: ")
    string = string.replace(' ', '')
    key = raw_input("Please enter the key you'd like to use: ")
    keylength = len(key)
    stringlength = len(string)
    overlap = stringlength % keylength
    leftovers = key[:overlap]
    random = stringlength - overlap
    random = stringlength / keylength
    key = (int(random) * key) + leftovers

    #convert Key to uppercase
    for i in key:
        number = Alphabet.index(i.upper())
        keylist.append(number)
    #convert String to uppercase
    for i in string:
        number = Alphabet.index(i.upper())
        stringlist.append(number)

    while count < stringlength:
            encrypted.append({stringlist[i] - keylist[i]} % 29)
            count += 1
            i += 1
    for N in encrypted:
        output.append(Alphabet[N])

    string = ''.join(output)
    print" "
    print"Output:"
    print" "
    print "The decoded text is:", string
    print" "

# main function
if __name__ == '__main__':

    selection = ''

    while selection != 3:
            selection = raw_input("\n\nEnter 1 to encrypt, 2 to decrypt, or 3 to exit: ")

            if selection == '1':
                    encrypt()
            elif selection == '2':
                    decrypt()
            elif selection == '3':
                    print "Thanks for using my program"
                    exit()
字母表=[“A”、“B”、“C”、“D”、“E”、“F”、“G”、“H”、“I”、“J”、“K”、“L”、“M”、“N”、“O”、“P”、“Q”、“R”、“S”、“T”、“U”,
“V”,“W”,“X”,“Y”,“Z”,“X”,“Y”,“Z”,“X”,“X”,“Y”,“X”,“Y”,“Z”,“Z”,“X”,“X”,“Y”,“X”,“Y”,“X”,“X”,“Y”,“X”,“Y”,“X”,“Y”,“Y”,“X”,“Y”,“X”,“Y”,“X”,“Y”,“Y”,“Y”,“Y”,“
def encrypt():
计数=0
i=0
输出=[]
加密=[]
keylist=[]
stringlist=[]
字符串=原始输入(“请输入要加密的字符串:”)
字符串=字符串。替换(“”,“”)
key=原始输入(“请输入您要使用的密钥:”)
keylength=len(键)
stringlength=len(字符串)
重叠=stringlength%keylength
剩余=关键点[:重叠]
随机=字符串长度-重叠
随机=stringlength/keylength
键=(int(随机)*键)+剩余
#将键转换为大写
对于i键:
数字=字母表索引(i.upper())
keylist.append(数字)
#将字符串转换为大写
对于字符串中的i:
数字=字母表索引(i.upper())
stringlist.append(编号)
当count
在本声明中

encrypted.append((stringlist[i] + keylist[i]) % 29)
您正在使用
i
,它以前用于对字符串进行迭代

for i in string:

因此,
i
仍然具有字符串的最后一个字符。您正在使用该字符串为列表编制索引。这就是python抛出此错误的原因。

请发布完整的回溯,包括行号。我理解为什么现在给我错误,但老实说,我不知道如何修复它。@user2998626为什么不在count时在
之前设置
I=0
?这解决了问题。非常感谢你的帮助。@ USER 998626请考虑接受这个答案,如果它对你有帮助: