2016-09-27 201 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