2014-02-20 138 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

啊好吧我會試圖弄清楚。謝謝你的幫助。 –