Python列表理解-转置

Python列表理解-转置,python,matrix,list-comprehension,Python,Matrix,List Comprehension,我只是从阅读清单开始理解。我理解这个例子,但我正试图找出一种方法,在不硬编码范围的情况下转置矩阵 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 我希望它能够计算出最大嵌套数

我只是从阅读清单开始理解。我理解这个例子,但我正试图找出一种方法,在不硬编码范围的情况下转置矩阵

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

我希望它能够计算出最大嵌套数组的最大元素数,而不是
范围(4)
。我尝试放置一个
lambda
,但不断从中出错。是否可以在一行中执行此操作?

假设所有子列表具有相同数量的元素:

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

或者用于长度不匹配的子列表。

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

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

你在第二个理解中使用括号。这是否意味着列表理解也可以是元组理解?不,括号中这样的表达式称为生成器表达式,与列表理解略有不同。了解一下,如果子列表的长度不匹配,为什么需要
key=len
max
不是已经给出了最大元素的长度了吗?该假设在文档的任何地方都没有定义。它也可以是子列表中元素的总和。最好明确一点,文档特别说,“返回一个iterable中最大的项,或者返回两个或多个参数中最大的项。”我不确定你建议它还可以做什么。呃,它是按内容(元素的总和)还是按长度最大?根据iterables的iterable,该声明并不明确。在任何情况下,我看不出放置
len
会导致任何问题。