tit*_*tus 200 python transpose list
让我们来:
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Run Code Online (Sandbox Code Playgroud)
我正在寻找的结果是
r = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Run Code Online (Sandbox Code Playgroud)
并不是
r = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
Run Code Online (Sandbox Code Playgroud)
非常感激
jen*_*ena 283
怎么样
map(list, zip(*l))
--> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Run Code Online (Sandbox Code Playgroud)
对于python 3.x用户可以使用
list(map(list, zip(*l)))
Run Code Online (Sandbox Code Playgroud)
Sig*_*gyF 55
一种方法是使用NumPy转置.对于列表,a:
>>> import numpy as np
>>> np.array(a).T.tolist()
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Run Code Online (Sandbox Code Playgroud)
或另一个没有拉链的:
>>> map(list,map(None,*a))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Run Code Online (Sandbox Code Playgroud)
ins*_*get 48
与耶拿的解决方案完全相同:
>>> l=[[1,2,3],[4,5,6],[7,8,9]]
>>> [list(i) for i in zip(*l)]
... [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Run Code Online (Sandbox Code Playgroud)
mat*_*hew 24
只是为了有趣,有效的矩形并假设m [0]存在
>>> m = [[1,2,3],[4,5,6],[7,8,9]]
>>> [[row[i] for row in m] for i in range(len(m[0]))]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Run Code Online (Sandbox Code Playgroud)
Bob*_*ein 21
这些方法都适用于Python 2或3.它们适用于"粗糙"的矩形2D列表.也就是说,内部列表不需要具有相同的长度.
import itertools
import six
list_list = [[1,2,3], [4,5,6, 6.1, 6.2, 6.3], [7,8,9]]
Run Code Online (Sandbox Code Playgroud)
>>> list(map(list, six.moves.zip_longest(*list_list, fillvalue='-')))
[[1, 4, 7], [2, 5, 8], [3, 6, 9], ['-', 6.1, '-'], ['-', 6.2, '-'], ['-', 6.3, '-']]
Run Code Online (Sandbox Code Playgroud)
map() 变
zip_longest() 在Python 2中six.moves.zip_longest() 在Python 3中默认的填充值是itertools.izip_longest().感谢@ jena的回答,itertools.zip_longest()将内部元组更改为列表.在这里,它将迭代器转换为列表.感谢@ Oregano和@ badp的评论.
>>> [list(row) for row in six.moves.zip_longest(*list_list, fillvalue='-')]
[[1, 4, 7], [2, 5, 8], [3, 6, 9], ['-', 6.1, '-'], ['-', 6.2, '-'], ['-', 6.3, '-']]
Run Code Online (Sandbox Code Playgroud)
>>> map(list, map(None, *list_list))
[[1, 4, 7], [2, 5, 8], [3, 6, 9], [None, 6.1, None], [None, 6.2, None], [None, 6.3, None]]
Run Code Online (Sandbox Code Playgroud)
这个非常紧凑的@SiggyF第二种选择适用于参差不齐的 2D列表,不像他的第一个使用numpy转置并通过不规则列表的代码.但无必须是填充值.(不,传递给内部map()的None不是填充值.这意味着没有传递行的功能.)
solution1 = map(list, zip(*l))
Run Code Online (Sandbox Code Playgroud)
solution2 = [list(i) for i in zip(*l)]
Run Code Online (Sandbox Code Playgroud)
solution3 = []
for i in zip(*l):
solution3.append((list(i)))
Run Code Online (Sandbox Code Playgroud)
print(*solution1)
print(*solution2)
print(*solution3)
# [1, 4, 7], [2, 5, 8], [3, 6, 9]
Run Code Online (Sandbox Code Playgroud)