2017-12-27 12 views
3

私は、より深いものを理解するためにPythonと一緒に遊んでいます。リストのリストの転置

私は簡単な方法の一つは、zipを使用することであることを学びましたが、どのようにこの件について:よく

>>> a = [[1,1,1], [2,2,2], [3,3,3]] 
>>> for i in range(len(a)): 
... for j in range(len(a[0])): 
...  a[i][j], a[j][i] = a[j][i], a[i][j] 
... 
>>> a 
[[1, 1, 1], [2, 2, 2], [3, 3, 3]] 
>>> 

、私はそれがどのようなトランスポーズですので

[[1, 2, 3], [1, 2, 3], [1, 2, 3]] 

になるように答えを期待していましただろう ?私は要素を交換しました、右?? また、この方法は私にとってより自然でした。私はジップhereのためのドキュメントを読んで、それはそのような "トリック"について何も言わない。どのように物事を行うこれらのより多くのpythonicの方法を学ぶ?私は、学習するためのリソースを求めることは主観的な選択に入り、SOはそのような質問を推奨しないことを認識しています。しかし、IMOでは、明らかにこの場合の選択の問題ではなく、そのような情報が利用可能なすべてのリソースを見つけることです。

+3

私はそれを得ることはありません。ここに質問がありますか? –

+0

あなたのリストは転載されないことに気付きましたか? – user2357112

+0

@cᴏʟᴅsᴘᴇᴇᴅ、編集された質問 – Adorn

答えて

11

あなたはl[1][0]l[0][1]を交換...そしてあなたがl[1][0]に取得するときに、あなたはl[0][1]l[1][0]を交換。要素のすべてのペアは、対角要素を除いて2回スワップされますが、それはどうにかスワップされます。すべてが始まりました。

あなたは要素スワップによる転置を実行したい場合は、二回のペアを交換しないようにする必要があります:

for i in range(len(a)): 
    for j in range(i+1, len(a)): 
     a[i][j], a[j][i] = a[j][i], a[i][j] 

はまた、あなたの転置は、暗黙的に正方形の入力を前提としています。 3x5の入力を受け取った場合は、a[4][2]がないため、とを交換することはできません。

+0

あなたは長方形行列。 –

+0

gotcha!質問の第2部分についてのコメント?移調のために 'zip'を使うのと同じように、何かをするためのもっとpythonicな方法を知りたいのですか?私の自然な思考プロセスは反復してからスワップすることでした。 'zip'のドキュメントはそれをカバーしていないので、私はそれを"トリック "と呼ぶ – Adorn

+0

@Adorn:[Googleはまともな仕事をする](https://www.google.com/search?q=python+transpose) Googleに表示されるものを自動的に信頼すべきではありません。 – user2357112

0

ループ中にaを上書きしているため、最初のトランスポーズ操作後に2番目のトランスポーズ操作を実行すると最初のトランスポーズ操作が取り消されるという問題があります。

aのコピーを作成して(aを上書きしないでもかまいません)、リストの理解度でコピーできます。

import copy 
a = [[1,1,1], [2,2,2], [3,3,3]] 
a2 = copy.deepcopy(a) 
for i in range(len(a)): 
    for j in range(len(a[0])): 
    a2[i][j] = a[j][i] 

a3 = [[a[j][i] for j, _ in enumerate(ai)] for i, ai in enumerate(a)] 

print(a) 
print(a2) 
print(a3) 
1

また、ちょうどここに、基本的なリストの内包表記を使用することができます。

a = [[1,1,1], [2,2,2], [3,3,3]] 

transposed = [[x[i] for x in a] for i in range(len(a[0]))] 

print(transposed) 
# [[1, 2, 3], [1, 2, 3], [1, 2, 3]] 
関連する問題