在两个列表中运行值的循环

时间:2017-03-08 23:35:11

标签: python list loops encryption

我正在尝试创建一个有效的Vigenère密码,但似乎无法弄清楚如何创建一个循环遍历两个不同列表的循环。

这应该来自以下计算:

明文:HAPPYBIRTHDAY键:BADBADBADBADB密文:IASQYEJRWIDDZ

这是我的代码实际产生的结果:

密文:'IBQQZCJSUIEBZHAPPYBIRTHDAYKDSSBELUWKGDB'

我的代码:

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

我理解为什么我的代码错了,但无法弄清楚如何解决它。非常感谢任何反馈/帮助!

2 个答案:

答案 0 :(得分:0)

迭代序列和密钥的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

答案 1 :(得分:0)

您可以使用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
相关问题