1

forループを使用せずにリスト内包表記のみを使用して、多次元行列(3x3、4x4、5x5...)を転置する必要があるPythonの割り当てがあります。

2x2 行列の例として、次のものがあります。

a2 = [[1, 2], [3, 4]]
n = len(a2)
print [[row[i] for row in a2] for i in range(n)]

しかし、それがどのように機能するのか、または3x3、4x4、5x5 ...マトリックスに適応させる方法を本当に理解しているかどうかはわかりません。

たとえば、

a3 = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

必ずしもあなたに答えてもらいたいわけではありませんが (それでも自分で解決する必要があります)、ヒントがあればとても役に立ちます!

前もって感謝します!

4

2 に答える 2

6

あなたの例ではすでにそれを持っていると確信しています...

a2 = [[1, 2], [3, 4]]  #2x2
n = len(a2)
print [[row[i] for row in a2] for i in range(n)]

a2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]  #3x3
n = len(a2)
print [[row[i] for row in a2] for i in range(n)]

オブジェクト:

a3 = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

2x2、3x3、4x4 ではなく、2x2x2 です。transposeそのデータ構造の意味を正確に説明する必要があります。

補足として、リスト内包表記を制約として持っていない場合は、zipLattyware の提案どおりに使用することをお勧めします。この場合、ソリューションが既に機能していることを指摘したいだけですNxN

于 2013-01-25T14:56:27.467 に答える
5

これにzip()は組み込み関数があります。

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

への呼び出しlist()は結果を表示するためのものであることに注意してください。3.x では、リストではなくイテラブルが生成されます (これは遅延であり、メモリの利点があります)。2.x では、とにかくリストを返します。

より多くのネストされたリストを含む例で内部部分も転置したい場合は、リスト内包表記を使用zip()してサブリストで実行するのは比較的簡単です。

読みやすくするための 2.x の例:

>>> zip(*(zip(*part) for part in [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]))
[((1, 3), (5, 7)), ((2, 4), (6, 8))]
于 2013-01-25T14:54:16.827 に答える