我有一个简单的问题!我有一个矩阵,说8列,大约20行。矩阵的每个索引都填充了一些字母。我想知道是否有一种有效的方法来生成矩阵的排列(列)?我正在研究Column Transposition Cipher,我想基本上测试每个列的排列(交换整列),这样我就可以解决密码。
有没有一种有效的方法可以使用python中的itertools或我不知道的任何其他技术?非常感谢您的帮助!
我首先初始化数组:
LMATRIX = [['' for x in xrange(8)] for x in xrange(53)]
然后稍后填写信件......
E.g 在排列之前:
0 1 2 3 4 5 6 7
B C R H L M N O
J F K A B C D R
在一次迭代后进行排列:
**1 0** 2 3 4 5 6 7
**C B** R H L M N O
**F J** K A B C D R
再次感谢!
答案 0 :(得分:1)
我没有玩过这个解决方案,但它似乎适用于简单的情况。出于可读性目的,矩阵较小。我们的想法是,itertools.permutations
将为每一行生成相同的排列,然后您需要zip
将它们重新组合成每个置换矩阵。您需要将下面的代码概括为更大的矩阵。所有人都仔细阅读itertools.permutations
以确保所有潜在输入的排列“相同”
In [1]: import string
In [2]: import random
In [3]: LMATRIX = [[random.choice(string.ascii_uppercase) for y in xrange(3)] for x in xrange(2)]
In [4]: def print_mat(m):
...: for row in m:
...: print row
...:
原始矩阵是:
In [5]: print_mat(LMATRIX)
['V', 'E', 'E']
['G', 'X', 'T']
In [6]: from itertools import permutations
In [7]: for perm in zip(permutations(LMATRIX[0]), permutations(LMATRIX[1])):
...: print_mat(perm)
...: print "\n"
...:
('V', 'E', 'E')
('G', 'X', 'T')
('V', 'E', 'E')
('G', 'T', 'X')
('E', 'V', 'E')
('X', 'G', 'T')
('E', 'E', 'V')
('X', 'T', 'G')
('E', 'V', 'E')
('T', 'G', 'X')
('E', 'E', 'V')
('T', 'X', 'G')