Python 为两个列表中的值运行循环
我试图创建一个有效的Vigenère密码,但似乎不知道如何创建一个在两个不同列表中循环的循环 这应通过以下计算得出: 明文:HappyBirthdy密钥:BADB密文:IASQYEJRWIDDZ 这就是我的代码的实际结果: 密文:'ibqzcjsuiebzhappybirthdaykdssbeluwkgdb' 我的代码: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 = [ "
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(键,普通):…