【问题标题】:Running a loop for values in two lists为两个列表中的值运行循环
【发布时间】:2017-07-29 18:25:11
【问题描述】:

我正在尝试创建一个有效的 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

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

【问题讨论】:

  • 您需要一个同时遍历 两个 列表的循环,这就是 zip() 的用途:for key,let in zip(key_ls,plain_ls):...

标签: python list loops encryption


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 2019-09-15
      • 2023-03-18
      • 2020-11-04
      • 2021-03-31
      • 1970-01-01
      • 2018-07-07
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多