我有一个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)]
list
(你有元组的列表),你可以这样获取它们:map(list, a)
(其中 a
已经被转置)。 - Tadeckzip(*lst)
可以转置lst
。 :) - agazip(*x)
,但是还没有人解释过它。 - georgmap(None, a)
。 - jmilloy请查看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
实际上是参数列表的展开。您可以在以下说明中了解更多信息。
我希望现在每个人都能理解这段漂亮的代码是如何工作的。 :)
您提到了效率。您可以使用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
会截断为最短的长度。您可以使用'map'或itertools.izip_longest
来填充缺失值,用None
代替。另一种方法是:
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] for row in a] for i in range(len(a[i]))]
不仅是错误的(因为出现了 NameError
错误),而且很可能只是想表达 [[item for item in sublist] for sublist in a]
的意思。 - Tadeck