Python 密码和嵌套循环

Python cypher and nested loops

我是 python 的新手,我遇到了密码问题。 我需要显示与两个输入语句相关的 3 列。 用户输入是 'message' 和 'keytext'。 第一列只是一次吐出 'message' 一个字母。 第二列显示 'keytext' 输入的数值。 第三列显示通过将 'message' 中的字母移动 'keytext' 指示的相应值而创建的新文本 (抱歉这有点难以描述)

Message? HELLO
Keytext? AAAA
H 0 H
E 0 E
L 0 L
L 0 L
O 0 O

Message? HELLO
Keytext? ABBCD
H 0 H
E 1 F
L 1 M
L 2 N
O 3 R

现在我知道如何做一个简单的密码,但它让所有三列同时显示和合作,我只是想不通,似乎无法在任何地方找到答案。 (或者可能我只是不知道该问什么)

这是我目前的代码,在这个变体中我似乎无法让中间列正确迭代。

keytext = str(input("Keytext? ").upper())
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

for i in message:
    place = alphabet.find(i)
    for j in keytext:
        place2 = alphabet.find(j)
        newplace = (place + place2)% 26
        code = alphabet[newplace]
    print(i,place2,code)

如果 message = hello 和 keytext = abcde,那么预期的输出将是

H 0 H
E 1 F
L 2 N
L 3 O
O 4 S

但是目前是:

H 4 L
E 4 I
L 4 P
L 4 P
O 4 S

所以它只是弄清楚如何正确地将第 2 列放入循环中...... 有没有人对我如何解决这个问题有任何建议?任何帮助将不胜感激。

谢谢!

你确实想出了怎么做——除了一个小偏差。在内部 for 循环中,j 遍历 keytext 并覆盖 code。因此与预期输出的偏差。您所要做的就是删除内部 for 循环。

message = str(input("Message? ")).upper()
keytext = str(input("Keytext? ")).upper()

# Length of keytext and message should be same.
assert len(message) == len(keytext)

alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in range(len(message)):
    place = alphabet.find(message[i])
    place2 = alphabet.find(keytext[i])
    newplace = (place + place2) % len(alphabet)
    code = alphabet[newplace]
    print(message[i], place2, code)

输出:

Message? hello
Keytext? abcde
H 0 H
E 1 F
L 2 N
L 3 O
O 4 S