2011-06-26 58 views
3

我想要列出列表,並返回包含列表的原始列表的索引中的每個元素的列表的列表。我知道這措辭很糟糕。這是一個例子。通過索引按列表對列表中的元素進行分組

說我有列出的以下列表:

[[1,2,3], [4,5,6], [7,8,9]] 

我想列出的另一個列表,其中每個列表是在一個特定的索引中的每個元素的列表。例如:

[[1,2,3], [4,5,6], [7,8,9]] becomes [[1,4,7], [2,5,8], [3,6,9]] 

因此,返回列表中的第一個列表包含每個原始列表的第一個索引處的所有元素,依此類推。我被困住了,不知道如何做到這一點。任何幫助,將不勝感激。謝謝。

+2

FYI :這通常被稱爲轉置或旋轉。 – delnan

+0

@delnan:我寧可不叫它旋轉。 IMO旋轉是'mylist = mylist [1:] + mylist [:1]'(左)或mylist = mylist [-1:] + mylist [: - 1]'(右)。 – pillmuncher

回答

8
>>> [list(t) for t in zip(*[[1,2,3], [4,5,6], [7,8,9]])] 
[[1, 4, 7], [2, 5, 8], [3, 6, 9]] 
+0

我覺得真的很愚蠢,錯過了一個完全一樣的內置。在我的防守中,我從來沒有使用過像這樣的東西。雖然謝謝! –

2

也許是一個簡單的方法wiould是:

a=[[1,2,3], [4,5,6], [7,8,9]] 
b=zip(*a) 

B將被等於[(1,4,7),(2,5,8),(3,6,9) ]。 希望這有助於

+0

N.B:這個列表包含元組,而不是Python 2.x中的列表和Python 3.x中的'zip'對象。這可能是好的,但值得注意。 – Johnsyweb

+1

是的,這也許就足夠了。 Dan D.解決方案已經提供了完整的解決方案。你的解決方案使用數組也很好,謝謝。 – fransua

0

除了zip(*lists)方法,你也可以使用列表理解:

[[l[i] for l in lists] for i in range(3)] 
+0

或者'[[l [i] for l in lists] for i in range(len(lists))]''移除硬編碼的三。 – Johnsyweb

2

Dan D's answer是正確的,並會在Python 2.工作X和Python 3 X

如果你正在做大量的矩陣運算,而不只是換位,這是值得考慮的Numpy在這個節骨眼上:

>>> import numpy as np 
>>> x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 
>>> np.swapaxes(x, 0, 1) 
array([[1, 4, 7], 
     [2, 5, 8], 
     [3, 6, 9]]) 

,或者更簡單地說,按照該意見,使用numpy.transpose()

>>> np.transpose(x) 
array([[1, 4, 7], 
     [2, 5, 8], 
     [3, 6, 9]]) 
+1

爲什麼不只是'轉置'? – katrielalex

+0

@katrielalex:因爲我忘了它在那裏!感謝您的提醒。 – Johnsyweb

0

如果你想簡單地轉置你的矩陣,例如獲得新的矩陣,其中行是從最初的矩陣的cols而列等於初始矩陣的行值,則可以使用:

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


>>> [ 
    [1,4,7], 
    [2,5,8], 
    [3,6,9] 
    ] 

或者如果要旋轉矩陣左,那麼:

map(list, zip(*map(lambda x: x[::-1], initMatr) 

>>> [ 
     [3,6,9], 
     [2,5,8], 
     [1,4,7]  
    ] 
相關問題