You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:06:03