Caesar Cipher python 程序循环问题

Caesar Cipher python program looping issue

好的,所以我在 python 中使用凯撒密码程序已经走到了这一步,但看不出有任何原因这不起作用,但它没有......它输出新词作为'a' 'a' 'a'(无论单词中有多少字母)。我的猜测是它的某种循环导致每个字母都变成 'a' 但我就是想不通。有人可以帮我吗?谢谢

我的代码:

word = input("please enter the word you wish to encrypt: ")
seperated = list(word)
length = len(word)
alphabet1 = ["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"]
alphabet2 = ["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","a"]
length2 = len(alphabet1)
length3 = len(alphabet2)


for eachposition in range(length):
    for letter in range(length2):
            if seperated[eachposition] == alphabet1[letter]:
                    seperated.pop(eachposition)
                    seperated.insert(eachposition, alphabet2[letter])

print(seperated)

我在您的代码中添加了一些 print 调用,但在 seperated[eachposition] == alphabet1[letter] 不应该评估为 True 的情况下出现了很多误报。从那以后我很快就意识到了这个问题。

您从不在循环中使用 break,所以这是正在发生的事情:

  • 我输入"word"
  • 循环运行s直到发现第一个字母与字母表中的字母'w'相同
  • separated 的第一个字母设置为 'x',因为你的密码是如何工作的
  • 循环保持运行ning,现在测试第一个字母是否为'x'

因为你的密码只是将每个字母推进一个,这个循环将总是 运行 直到它到达你列表中的最后一个字母,'a'。

简单的解决方法是使用 break。它会提前结束一个 for 循环。这意味着当您替换了一个字母后,您想跳出那个内循环并移动到下一个字符。

for eachposition in range(length):
    for letter in range(length2):
        if seperated[eachposition] == alphabet1[letter]:
            seperated.pop(eachposition)
            seperated.insert(eachposition, alphabet2[letter])
            break

@SuperBiasedMan 为您提供了保留代码的有效解决方案,但我会为您的任务提出一个更简单的循环(不需要弹出和插入,因为您在整个单词中有序迭代)。

new = []
for c in word:
    for i in range(length2):
        if c == alphabet1[i]:
            new.append(alphabet2[i])
            break


new = ''.join(new)
print new

也可以考虑使用字典。它们在解决此类问题时会派上用场。

另一种方法是将每个字符转换为其 ASCII 码,即 a = 97,b = 98 等 asciitable.com 这可以通过 ord()

num = ord(character) - 97

然后你可以添加密钥来获取新的ascii码并转换回字符。您已经使用模数来允许从字母表的末尾循环到开头。

encr_char = chr((num + key)% 26 + 97)

您需要添加代码来处理大写字母 (ascii 65 - 90) 和非字母字符。 isupper()isalpha() 将在此处完成工作。

这种方法允许改变密钥。