Python列表理解 - 转置

时间:2016-09-27 16:07:36

标签: python matrix list-comprehension

我刚刚通过阅读matrix transposing tutorial here开始列表推导。我理解这个例子,但是我试图找到一种方法来转换矩阵而不用硬编码范围。

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 个答案:

答案 0 :(得分:2)

你可以使用另一种理解!它们是一个非常强大的工具。

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

答案 1 :(得分: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表示长度不匹配的子列表。