列表的最有效的方式,所以我有這個名單中巨蟒,什麼是將在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]]
要做到這一點,最有效的方法是什麼?我對編程相當陌生,很抱歉做小白菜。謝謝。
列表的最有效的方式,所以我有這個名單中巨蟒,什麼是將在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]]
要做到這一點,最有效的方法是什麼?我對編程相當陌生,很抱歉做小白菜。謝謝。
你可以那樣做:
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)]
退房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中閱讀更多關於它的內容。
我希望現在每個人都明白這段代碼是如何工作的。 :)
你可以使用zip進行簡單的轉置......但numpy非常棒! –
@aga:+1爲我的示例的解釋:) Numpy是一個偉大的數據包,但。 – Tadeck
另一種方法是:
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]))]
'[[row [i] in row in] in range(len(a [i]))]'不僅是不正確的(由於NameError的緣故,也可能僅僅是' [[在子列表中的項目]在子列表] – Tadeck
現在它的工作:) – 0605002
我其實很喜歡這個答案 – tipsywacky
你問到效率。您可以使用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
填寫缺失的值。
另請參閱http://stackoverflow.com/questions/10169919/python-matrix-transpose-and-zip,http://stackoverflow.com/questions/2921681/fast-matrix-transposition-in-python – georg