Python实现维吉尼亚加密获取二维列表索引 解决自由变量引用报错
问题解决方案
你的需求完全可以实现,报错及运行异常是由代码逻辑错误导致,具体问题及修复方案如下:
核心错误点
- 列表推导式逻辑错误:你在获取x、y的推导式中,直接引用了还未定义的循环变量x/y,触发「自由变量未赋值」报错
- 函数调用参数顺序错误:
encrypt_vigenere定义的参数顺序是(plaintext,key,grid2),你实际调用时传参为(plaintext,grid2,key),参数位置颠倒 - 索引获取逻辑冗余:维吉尼亚表的第一行固定为A-Z顺序,明文字符对应的列索引直接取第一行的下标即可;每行第一个字符为行对应的密钥字符,直接取首字符列表的下标就能得到行索引,不需要额外做嵌套判断
修正后完整代码
def making_dimensional_list(grid): grid2 = [list(line) for line in grid.split("\n")] return grid2 # 生成维吉尼亚二维表 grid2 = making_dimensional_list("""ABCDEFGHIJKLMNOPQRSTUVWXYZ BCDEFGHIJKLMNOPQRSTUVWXYZA CDEFGHIJKLMNOPQRSTUVWXYZAB DEFGHIJKLMNOPQRSTUVWXYZABC EFGHIJKLMNOPQRSTUVWXYZABCD FGHIJKLMNOPQRSTUVWXYZABCDE GHIJKLMNOPQRSTUVWXYZABCDEF HIJKLMNOPQRSTUVWXYZABCDEFG IJKLMNOPQRSTUVWXYZABCDEFGH JKLMNOPQRSTUVWXYZABCDEFGHI KLMNOPQRSTUVWXYZABCDEFGHIJ LMNOPQRSTUVWXYZABCDEFGHIJK MNOPQRSTUVWXYZABCDEFGHIJKL NOPQRSTUVWXYZABCDEFGHIJKLM OPQRSTUVWXYZABCDEFGHIJKLMN PQRSTUVWXYZABCDEFGHIJKLMNO QRSTUVWXYZABCDEFGHIJKLMNOP RSTUVWXYZABCDEFGHIJKLMNOPQ STUVWXYZABCDEFGHIJKLMNOPQR TUVWXYZABCDEFGHIJKLMNOPQRS UVWXYZABCDEFGHIJKLMNOPQRST VWXYZABCDEFGHIJKLMNOPQRSTU WXYZABCDEFGHIJKLMNOPQRSTUV XYZABCDEFGHIJKLMNOPQRSTUVW YZABCDEFGHIJKLMNOPQRSTUVWX ZABCDEFGHIJKLMNOPQRSTUVWXY""") def making_2_lists(keyword,text): key= [] text = text.upper().replace(" ", "") plaintext = list(text) keyword = keyword.upper().replace(" ", "") keyword = list(keyword) for j in range(len(text)): key.append(keyword[j%len(keyword)]) return plaintext,key # 生成明文和对齐后的密钥列表 plaintext, key = making_2_lists("tajne","To jest bardzo tajny tekst") def encrypt_vigenere(plaintext,key,grid2): # 提前生成首行和首字符列表,避免重复计算 first_row = grid2[0] first_col = [row[0] for row in grid2] index_pairs = [] # 逐字符获取对应索引 for symbol, letter in zip(plaintext, key): x = first_row.index(symbol) # 明文字符对应列索引 y = first_col.index(letter) # 密钥字符对应行索引 index_pairs.append((x,y)) # 如果要直接生成密文,返回 grid2[y][x] 即可 return index_pairs # 注意参数顺序不要传错 print(encrypt_vigenere(plaintext, key, grid2))
运行说明
返回的列表中每个元组第一个元素是明文字符对应的列索引x,第二个元素是密钥字符对应的行索引y,完全符合你要求的「A对应x=0,B对应y=1」的规则。如果需要直接输出密文,直接在循环中取grid2[y][x]拼接即可。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

