Python 为两个列表中的值运行循环

Python 为两个列表中的值运行循环,python,list,loops,encryption,Python,List,Loops,Encryption,我试图创建一个有效的Vigenère密码,但似乎不知道如何创建一个在两个不同列表中循环的循环 这应通过以下计算得出: 明文:HappyBirthdy密钥:BADB密文:IASQYEJRWIDDZ 这就是我的代码的实际结果: 密文:'ibqzcjsuiebzhappybirthdaykdssbeluwkgdb' 我的代码: def vigenere_enc(plain, key): plain_ls = list( plain ) key_ls = list( key ) alpha = [ "

我试图创建一个有效的Vigenère密码,但似乎不知道如何创建一个在两个不同列表中循环的循环

这应通过以下计算得出:

明文:HappyBirthdy密钥:BADB密文:IASQYEJRWIDDZ

这就是我的代码的实际结果:

密文:'ibqzcjsuiebzhappybirthdaykdssbeluwkgdb'

我的代码:

def vigenere_enc(plain, key):

plain_ls = list( plain )
key_ls = list( key )
alpha = [ "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" ]
ls = []

for key in key_ls:
    position_key = alpha.index( key )

    for let in plain_ls:
        position_let = alpha.index( let )

        shift = position_let + position_key 

        if shift > 26:
            shift_from_beg = ( shift - 26)
            add_let = alpha[ shift_from_beg ]
            ls.append( add_let )

        else:
            else_add_let = alpha[ shift ]
            ls.append( else_add_letn )

string = ''.join( ls )
return string

我理解为什么我的代码是错误的,但不知道如何修复它。非常感谢您的任何反馈/帮助

迭代序列和键的zip对象。对于键的重复填充,请使用
itertools.cycle

>>> from itertools import cycle
>>> s = 'Hello world!'
>>> key = 'BAD'
>>> for a, b in zip(s, cycle(key)):
...     print(a, b)
...
H B
e A
l D
l B
o A
  D
w B
o A
r D
l B
d A
! D

迭代序列和键的zip对象。对于键的重复填充,请使用
itertools.cycle

>>> from itertools import cycle
>>> s = 'Hello world!'
>>> key = 'BAD'
>>> for a, b in zip(s, cycle(key)):
...     print(a, b)
...
H B
e A
l D
l B
o A
  D
w B
o A
r D
l B
d A
! D

您可以使用
enumerate
获取循环的当前索引。请尝试以下操作:

def vigenere_enc(plain, key):

    plain_ls = list( plain )
    key_ls = list( key )
    alpha = [ "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" ]
    ls = []

    for idx, key in enumerate(key_ls):
        position_key = alpha.index( key )

        let = plain_ls[idx]
        position_let = alpha.index( let )

        shift = position_let + position_key

        if shift > 26:
            shift_from_beg = ( shift - 26)
            add_let = alpha[ shift_from_beg ]
            ls.append( add_let )

        else:
            else_add_let = alpha[shift]
            ls.append( else_add_let )

    string = ''.join( ls )
    return string

您可以使用
enumerate
获取循环的当前索引。请尝试以下操作:

def vigenere_enc(plain, key):

    plain_ls = list( plain )
    key_ls = list( key )
    alpha = [ "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" ]
    ls = []

    for idx, key in enumerate(key_ls):
        position_key = alpha.index( key )

        let = plain_ls[idx]
        position_let = alpha.index( let )

        shift = position_let + position_key

        if shift > 26:
            shift_from_beg = ( shift - 26)
            add_let = alpha[ shift_from_beg ]
            ls.append( add_let )

        else:
            else_add_let = alpha[shift]
            ls.append( else_add_let )

    string = ''.join( ls )
    return string

您需要一个同时在两个列表中运行的循环,这就是
zip()
的作用:
用于键,让输入zip(键,普通):…
您需要一个同时在两个列表中运行的循环,
zip()
的作用是:
用于键,让输入zip(键,普通):…