Edited at

Python標準で転置行列

More than 3 years have passed since last update.

zipを利用すれば良い。

>>> matrix = [

... [1, 2, 3],
... [4, 5, 6],
... [7, 8, 9]
... ]
>>> list(map(list, zip(*matrix)))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]


解説

関数にイテレーション可能なオブジェクトを渡すときに*をつけると展開されて渡される。

なので、zip(*matrix)zip([1, 2, 3], [4, 5, 6], [7, 8, 9])は等価。

そして、list(zip(*matrix))だと、中身がタプルになってしまうので、mapを使用してlistに変換する。

>>> list(zip(*matrix))

[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
>>> list(map(list, zip(*matrix)))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]


問題点

このやり方だと行が1行の時にはエラーが出てしまう。

>>> matrix = [1, 2, 3]

>>> list(map(list, zip(*matrix)))
TypeError: zip argument #1 must support iteration

そもそも行が1行の行列を扱う機会がどれだけあるのかは知りません。

(追記)

1行の場合は*を付けずにやれば一応できますね。

>>> matrix = [1, 2, 3]

>>> list(map(list, zip(matrix)))
[[1], [2], [3]]