2014-02-20 121 views
0

我有一个快速问题!我有一个矩阵,有8列和约20行。矩阵的每个索引都填充了一些字母。我想知道是否有一个有效的方法来产生矩阵的排列(列)?我正在研究Column Transposition Cipher,我想要测试每个列置换(交换整列),以便我可以解密密码。矩阵中列的排列

有没有一种有效的方式来做到这一点使用itertools在Python或任何其他技术我不知道?非常感谢您的帮助!

我首先初始化数组这样做:

LMATRIX = [['' for x in xrange(8)] for x in xrange(53)] 

再后来就用字母填充它...

如 置换前:

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 

再次感谢!

+1

取决于你用什么数据结构使用表示矩阵[ itertools.permutations](http://docs.python.org/2/library/itertools.html#itertools.permutations)似乎要走的路 – bvidal

+0

是的,但我该如何去使用新创建的列置换交换列而不使用for循环? > _>没有更有效的方法吗? –

回答

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') 
+0

这是完美的!现在我将如何去做一个8 x 52矩阵? (8列乘52行)哈哈... –

+0

我想你可能需要[itertools.izip](http://docs.python.org/2/library/itertools.html#itertools.izip)处理更大的矩阵。也可以参考[numpy](http://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.html)来进行矩阵运算。 – bvidal

+0

啊好吧我会试图弄清楚。谢谢你的帮助。 –