在 Python 中生成 Vigenère 密码 table

Generate Vigenère Cypher table in Python

我一直在努力在 python 中创建 vigenere table 应该是这样的结果:

所以基本上我在第一行有整个字母表,在第二行有一个字母移位的字母表等等。

到目前为止,这是我的代码:

class CypherTable:

    def __init__(self):
        self.matrix = [[chr(i) for i in range(ord('a'),ord('z')+1)] for i in range(5)]

    def __str__(self):
        for i in range(len(self.matrix)):
            print self.matrix[i]
        return ""

table = CypherTable()
print(table)

我设法打印了很多次从 a 到 z 的字母,但我不知道如何修改每个交互以将第一个字母移动一个。 我习惯于在 java 中工作,您首先定义数组长度然后填充它,但由于 python 具有更快的语法,我无法弄清楚什么是最好的方法。

更简单的方法是使用 string 模块:

from string import ascii_uppercase as l

class CypherTable:
   def __init__(self):
      self.final_table = [l[i:]+l[:i] for i in range(len(l))]

for i in CypherTable().final_table:
    print(i)

输出:

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

为了更加简洁,特别是如果您不在 class 中声明任何其他方法,您可以使用 @classmethod:

from string import ascii_uppercase as l
class CypherTable:
    final_table = [l[i:]+l[:i] for i in range(len(l))]
    @classmethod
    def show_board(cls):
        for i in cls.final_table:
           print(i)

CypherTable.show_board()

关于你最近的评论,你可以试试这个:

from string import ascii_uppercase as l
class CypherTable:
   def __init__(self):
      self.final_table = [l[i:]+l[:i] for i in range(len(l))]
   def cross(self, b, a):
       val1 = self.final_table[0].index(a)
       new_letter = [i for i in self.final_table if i[0] == b][0][val1]
       return new_letter

c = CypherTable()
print(c.cross('P', 'C'))

输出:

'R'

这是您的代码,只进行了最少的更改。您可以使用模数从 26 循环回到 0。请注意 __str__ 应该 return 一个字符串并且不应该打印任何内容:

class CypherTable:

    def __init__(self):
        self.matrix = [[chr(ord('A') + (i + j) % 26) for i in range(26)] for j in range(5)]

    def __str__(self):
        return "\n".join('|'.join(row) for row in self.matrix)

table = CypherTable()
print(table)

它输出:

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
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|A
C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B
D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C
E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D