生成Vigenè;Python中的重加密表

生成Vigenè;Python中的重加密表,python,vigenere,Python,Vigenere,我一直在努力用python创建vigenere表 结果应该是: 所以基本上我把整个字母表放在第一行,第二行字母表移动了一个字母,以此类推 这是我目前的代码: 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 i

我一直在努力用python创建vigenere表 结果应该是:

所以基本上我把整个字母表放在第一行,第二行字母表移动了一个字母,以此类推

这是我目前的代码:

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具有更快的语法,我不知道最好的方法是什么。

更简单的方法是使用
字符串
模块:

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
'R'
为了更干净,特别是如果您不在类中声明任何其他方法,您可以使用
@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'))
输出:

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
'R'

这是您的代码,改动最少。您可以使用模从26循环回0。请注意,
\uuu str\uuu
应返回一个字符串,并且不应打印任何内容:

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

看看这个链接。。对不起,我可能没有很好地解释我自己,这看起来像一个一维列表,我应该能够访问这些元素,因此,为了找到两个字母之间的对应字母,例如R中的P和C交叉,所以我应该能够[indexOfP][indexOfC]@Alex没有问题,请看我最近的编辑,让我知道它是否适合你。非常适合。非常感谢!我真的不明白你在交叉法中使用的算法although@Alex首先,该方法获取
最终_表
的第一行,即“标题”,并查找传递给该方法的第二个变量的索引。然后,对
final_table
进行迭代,以找到以传递给该方法的第一个值开头的行。从那里,通过索引访问列表中的元素,并访问存储在
val1
中的第二个变量的索引,即交叉值。这非常聪明,非常棒!这有点像在java中使用两个索引获取一个值,就像[i][j]了解一切一样!