2012-09-03 77 views
1

一個mutidimentional陣列我如何實現9號線和10即兩個for環在Python通過在python

matrix = [ 
    [1, 2, 3, 4], 
    [5, 6, 7, 8], 
    [9, 10, 11, 12] 
] 

newMatrix = [] 

for (i=0; i < len(matrix); i++): 
    for (j=0; j < len(matrix[i]); j++): 
     newMatrix[j][i] = matrix[i][j] 
print newMatrix 

PS循環:我知道我能做到[[row[i] for row in matrix] for i in range(4)]但我怎麼只有使用循環

+4

矩陣轉換可以這樣完成:'zip(* matrix)' – satoru

+0

@ Satoru.Logic:這應該是一個答案。 – georg

+0

@ thg435好吧,現在我已經添加了一個答案。 – satoru

回答

2

使用range(或xrange)。

for i in range(len(matrix)): 
    for j in range(len(matrix[i])): 

僅供參考,分配給newMatrix[i][j]將失敗,因爲newMatrix是一個空list。您需要爲每行添加一個新的空listnewMatrix,然後在每次迭代中將新值添加到該列表中。

+0

我該如何做你的FYI部分 – aWebDeveloper

+0

@WebDeveloper:我想我在我的回答中表達得很清楚。你不明白哪部分?你是怎麼試着編碼的? – MAK

1

可以使用enumerate() function循環在兩個矩陣值,給你指數:

newMatrix = [[0] * len(matrix) for _ in xrange(len(matrix[0]))] 
for i, row in enumerate(matrix): 
    for j, value in enumerate(row): 
     newMatrix[j][i] = value 

此輸出:

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] 

因爲你是直接解決新的矩陣的行和列,您需要首先用空值初始化該新矩陣。在我的例子的第一行列表理解爲你做到這一點。它給定大小的輸入矩陣(Xÿ)創建在大小的新矩陣是(ÝX)。

或者,也可以使用zip function避免被(AB)共顯性循環:

newMatrix = zip(*matrix) 

這需要matrix和組每列的每行中的那些行插入新行。

在一般情況下,python for構造循環序列。該range()xrange()功能可以產生數字序列對你來說,這些生成數列在大致相同的方式,一個for循環使用C或JavaScript會產生:

>>> for i in range(5): 
>>> print i, 
0 1 2 3 4 

但結構遠遠比C更強大式for構造。在大多數這樣的循環中,您的目標是爲某些序列提供索引,python構造繞過索引並直接轉到序列中的值。

+0

不存在像其他語言一樣的簡單循環。 Y是如此複雜 – aWebDeveloper

+0

@WebDeveloper:它更簡單的循環;複雜性在於你的新矩陣需要初始化。 –

+0

@WebDeveloper:你能發佈一個更簡單的例子嗎? – Blender

1

只是扔東西進入答案的搭配,如果你正在做任何一種與Python的矩陣運算,可以考慮使用numpy

>>> import numpy 
>>> matrix = numpy.matrix([ 
...  [1, 2, 3, 4], 
...  [5, 6, 7, 8], 
...  [9, 10, 11, 12] 
... ]) 

轉置是很簡單的事:

>>> matrix.transpose() 
matrix([[ 1, 5, 9], 
     [ 2, 6, 10], 
     [ 3, 7, 11], 
     [ 4, 8, 12]])