什么是在python中转换列表的最有效方法

tip*_*cky 3 python

所以我在python中有这个列表,

a=  [[1,2,3,4],
     [2,4,5,1],
     [3,4,6,2],
     [2,3,4,5]]
Run Code Online (Sandbox Code Playgroud)

并希望将列表水平翻转为垂直.

b=    [[1,2,3,2],
       [2,4,4,3],
       [3,5,6,4],
       [4,1,2,5]]
Run Code Online (Sandbox Code Playgroud)

什么是最好的方法,最有效的方法呢?我很喜欢编程,对不起是菜鸟.谢谢.

Tad*_*eck 10

你可以这样做:

zip(*your_list)
Run Code Online (Sandbox Code Playgroud)

证明:

>>> 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)]
Run Code Online (Sandbox Code Playgroud)


aga*_*aga 8

看看numpy图书馆.您可以将列表放入数组并将其转置为:

a = array ([[1,2,3,4],
       [2,4,5,1],
       [3,4,6,2],
       [2,3,4,5]])
a.transpose()
Run Code Online (Sandbox Code Playgroud)

PS:Tadeck解决方案的解释非常简单.zip有以下签名:

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

因此,它需要许多序列(我们不知道究竟多少)然后按以下顺序构建元组:获取每个序列的第一个元素ant将它们放入元组中,然后获取每个序列的第二个元素并将它们放入在第二个元组中等等.它返回它在执行期间构建的所有元组的列表.

*lst - 实际上是解压缩参数列表.您可以在以下注释中阅读更多相关信息.

我希望,现在每个人都明白这段漂亮的代码是如何工作的.:)


jmi*_*loy 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
Run Code Online (Sandbox Code Playgroud)

对于大型数据集 [[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
Run Code Online (Sandbox Code Playgroud)

如果列表的长度不同,则zip截断为最短的长度.您可以使用"地图"或itertools.izip_longest代替填充缺失值None.