2012-09-22 64 views
3

列表的最有效的方式,所以我有這個名單中巨蟒,什麼是將在Python

a= [[1,2,3,4], 
    [2,4,5,1], 
    [3,4,6,2], 
    [2,3,4,5]] 

,並希望把列表閱讀水平垂直。

b= [[1,2,3,2], 
     [2,4,4,3], 
     [3,5,6,4], 
     [4,1,2,5]] 

要做到這一點,最有效的方法是什麼?我對編程相當陌生,很抱歉做小白菜。謝謝。

+0

另請參閱http://stackoverflow.com/questions/10169919/python-matrix-transpose-and-zip,http://stackoverflow.com/questions/2921681/fast-matrix-transposition-in-python – georg

回答

10

你可以那樣做:

zip(*your_list) 

證明:

>>> a = [[1, 2, 3, 4], [2, 4, 5, 1], [3, 4, 6, 2], [2, 3, 4, 5]] 
>>> zip(*a) 
[(1, 2, 3, 2), (2, 4, 4, 3), (3, 5, 6, 4), (4, 1, 2, 5)] 
+1

如果你需要'list's(你有元組列表),你可以像這樣得到它們:'map(list,a)'(其中'a'已被轉置)。 – Tadeck

+0

這是一個很好的。花上幾分鐘的時間來理解爲什麼'zip(* lst)'轉換'lst'。 :) – aga

+0

您的證據顯示它是正確的,但不是它*效率*。 – jmilloy

8

退房numpy庫。你可以把你的名單分成數組,轉像這樣:

a = array ([[1,2,3,4], 
     [2,4,5,1], 
     [3,4,6,2], 
     [2,3,4,5]]) 
a.transpose() 

P.S .:的Tadeck的解決方案的解釋是很容易的。 zip具有以下特徵:

zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]

因此,它需要多個序列(我們不知道究竟怎麼了),然後建立以下順序元組:需要的序列第一要素螞蟻把它們放在元組中,然後將每個序列的第二個元素放到第二個元組中,依此類推。它返回它在執行期間構建的所有元組的列表。

*lst - 實際上是對參數列表進行解包。您可以在following note中閱讀更多關於它的內容。

我希望現在每個人都明白這段代碼是如何工作的。 :)

+0

你可以使用zip進行簡單的轉置......但numpy非常棒! –

+0

@aga:+1爲我的示例的解釋:) Numpy是一個偉大的數據包,但。 – Tadeck

1

另一種方法是:

a= [[1,2,3,4], 
    [2,4,5,1], 
    [3,4,6,2], 
    [2,3,4,5]] 
a = [[row[i] for row in a] for i in range(len(a[0]))] 
+3

'[[row [i] in row in] in range(len(a [i]))]'不僅是不正確的(由於NameError的緣故,也可能僅僅是' [[在子列表中的項目]在子列表] – Tadeck

+1

現在它的工作:) – 0605002

+0

我其實很喜歡這個答案 – tipsywacky

5

你問到效率。您可以使用timeit

>python -m timeit -s "a = [[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]" "zip(*a)" 
1000000 loops, best of 3: 0.569 usec per loop 

>python -m timeit -s "a = [[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]" "map(None, *a)" 
1000000 loops, best of 3: 0.644 usec per loop  

>python -m timeit -s "a = [[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]" "[[row[i] for row in a] for i in xrange(len(a[0]))]" 
1000000 loops, best of 3: 1.43 usec per loop  

>python -m timeit -s "from numpy import array; a = array([[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]])" "a.transpose()" 
1000000 loops, best of 3: 0.249 usec per loop 

對於[[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]*1000000

>python -m timeit -s "a = [[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]*1000000" "zip(*a)" 
10 loops, best of 3: 400 msec per loop 

>python -m timeit -s "a = [[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]*1000000" "map(None, *a)" 
10 loops, best of 3: 458 msec per loop 

>python -m timeit -s "a = [[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]*1000000" "[[row[i] for row in a] for i in xrange(len(a[0]))]" 
10 loops, best of 3: 770 msec per loop 

>python -m timeit -s "from numpy import array; a = array([[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]*1000000)" "a.transpose()" 
1000000 loops, best of 3: 0.251 usec per loop 

大型數據集如果你的列表的長度不同,zip截斷到最短。您可以使用'地圖'或itertools.izip_longest來代替None填寫缺失的值。

+0

效率並不一定意味着*最快*的解決方案,通常指的是算法。 – jamylak

+0

@jamylak:對。我相信進口報表應該是時間安排的一部分。否則,測試將不公平(除非任何後續導入實際將使用先前導入的模塊,這是我所懷疑的)。 – Tadeck

+0

@Tadeck正確,這需要通過爲設置添加'-s'來解決。我將在此期間發佈我的結果。 – jamylak