2016-09-27 4 views
1

私はちょうどmatrix transposing tutorial hereを読んでリスト内包表記を始めます。私は例を理解するが、私は範囲をハードコーディングせずに行列を転置する方法を把握しようとしている。その代わりrange(4)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 

、私はの最大数を把握できるようにしたいです最大の入れ子配列が持つ要素。私はlambdaを配置しようとしましたが、それからエラーが発生し続けました。 1ライナーでこれを行うことは可能ですか?不一致の長さを持つサブリストについては

s = len(matrix[0]) 
lcomp = [[row[i] for row in matrix] for i in range(s)] 

::サイドノートで

s = len(max(matrix, key=len)) 

、あなたが簡単にあなたの行列を転置ことができるすべてのサブリストは、同じ数の要素を持っていると仮定すると

答えて

2

別の理解を使用することもできます。彼らは非常に強力なツールです。

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

2番目の理解の周りにかっこを使用します。リスト内包表記はタプル内包表記とすることもできますか? – qarthandso

+1

いいえ、このようなカッコで囲まれた式はジェネレータ式と呼ばれ、リスト内包とは若干異なります。 [here](https://www.python.org/dev/peps/pep-0289/)についてはこちらをご覧ください。 – IanAuld

1

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

と明記してください。ドキュメントには、特に、反復可能な最大のアイテムまたは2つ以上の引数のうち最大のアイテムを返すと書かれています。他に何ができるか分かりません。 – qarthandso