2012-08-01 97 views
2

我试图在没有实际使用矩阵的大小的情况下在python中找到矩阵的转置。矩阵的转置

我需要使用列表解析来做一些类似[[row [i] for test in] for i in range(n)],其中test是一个nxn矩阵,实际上并不使用n。

+2

http://stackoverflow.com/q/4937491/395857的副本? – 2012-08-01 21:14:45

+0

@FranckDernoncourt我的问题不同于那个,因为我指定我需要一个列表理解而不使用大小。 – ffledgling 2012-08-01 21:25:20

回答

5

如果test是通过一个列表的列表表示的矩阵,则

zip(*test) 

是转置。例如,

In [16]: t = [[1,2,3],[4,5,6]] 

In [17]: t 
Out[17]: [[1, 2, 3], 
      [4, 5, 6]] 

In [18]: zip(*t) 
Out[18]: [(1, 4), 
      (2, 5), 
      (3, 6)] 

(输出已被格式化以更清楚地显示结果)。

要了解zip(*t)第一次研究how zip works,然后研究argument unpacking。它有点像一个弯路,但是一旦你看到它是如何工作的,你将成为这两个概念的专家,效果相当令人满意。


没有理由在这里使用列表理解,但这里是你如何能做到这一点呢:(len(t[1])给出了列数)

In [21]: [[row[i] for row in t] for i in range(len(t[1]))] 
Out[21]: [[1, 4], [2, 5], [3, 6]] 

1

您可以使用组合zip*

>>> list(zip(*[[1,2,3],[4,5,6]])) 
[(1, 4), (2, 5), (3, 6)] 
1

列表理解可以帮助如下所示:

def transpose(matrix): 
    return [[row[col] for row in matrix] for col in range(len(matrix[0]))]