2016-09-27 202 views
1

我剛剛開始閱讀matrix transposing tutorial here列表解析。我理解的例子,但我試圖找出一種方法來轉置矩陣沒有硬編碼的範圍英寸Python列表理解 - 移調

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

lcomp = [[row[i] for row in matrix] for i in range(4)] 
print(lcomp) 

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

相反的range(4),我希望它能夠計算出的最大數量最大的嵌套數組具有的元素。我嘗試過放置lambda,但不斷收到錯誤信息。是否有可能以單線形式做到這一點?

回答

2

你可以使用另一種理解!他們是一個非常強大的工具。

[[row(i) for row in matrix] for i in range(max(len(r) for r in matrix))] 
+0

圍繞第二個理解使用括號。這是否意味着列表解析也可以是元組理解? – qarthandso

+1

不,像括號中所包含的表達式稱爲生成器表達式,並且與列表解析略有不同。請閱讀[這裏](https://www.python.org/dev/peps/pep-0289/) – IanAuld

1

假設所有子列表具有相同數量的元素:

s = len(matrix[0]) 
lcomp = [[row[i] for row in matrix] for i in range(s)] 

對於不匹配長度子列表:

s = len(max(matrix, key=len)) 

在一個側面說明,你可以很容易地轉你的矩陣zip

matrix_T = zip(*matrix) # wrap with list() for Python 3 

或使用itertools.izip_longest表示長度不匹配的子列表。

+0

如果子列表長度不匹配,爲什麼'key = len'是必需的?是不是'max'已經給你最大元素的長度? – qarthandso

+0

該假設在['max'](https://docs.python.org/2/library/functions.html#max)的文檔中沒有定義。它也可以是子列表中元素的總和。更好的是明確 –

+0

該文檔具體說,_'返回一個迭代中的最大項目或兩個或更多個參數中最大的項目。'_我不確定您還有什麼建議它可以做。 – qarthandso