我正在尝试创建一个有效的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
我理解为什么我的代码错了,但无法弄清楚如何解决它。非常感谢任何反馈/帮助!
答案 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