我有一个N个列表的列表,每个子列表包含M个元素。
如何创建一个包含N个元素的M列表列表,其中包含初始列表中的第n个元素?
让我说我有这个
myList = [[1, 2, 3],[4, 5, 6]]
我想要
[[1, 4],[2, 5],[3, 6]]
表现也很重要。我有数百万个元素的子列表(但是,一个维度总是很小:像1.000.000 x 8)
答案 0 :(得分:3)
这将给出元组,但将其扩展为包含列表是微不足道的:
zip(*myList)
即
[list(i) for i in zip(*myList)]
答案 1 :(得分:3)
>>> lst = [[1, 2, 3], [4, 5, 6]]
>>> zip(*lst)
[(1, 4), (2, 5), (3, 6)]
zip
返回Python 2中的列表,但是Python 3中的迭代器,如果需要(list(zip(lst))
)必须转换为列表
另请参阅:Matrix Transpose in Python,Transpose/Unzip Function (inverse of zip)?
zip(*lst)
使用lst
运算符将*
的元素解包到zip
函数的单独参数中。
我们知道当我们放入两个列表时会发生什么:
>>> zip([1, 2, 3], [4, 5, 6])
[(1, 4), (2, 5), (3, 6)]
因此,如果我们有一个包含这两个列表的列表,*
将解压缩列表以形成两个单独的参数 - 相当于上述调用。
>>> zip(*[[1, 2, 3], [4, 5, 6]])
[(1, 4), (2, 5), (3, 6)]
答案 2 :(得分:3)
使用
myList = [[1, 2, 3],[4, 5, 6]]
zip(*myList )
答案 3 :(得分:2)
itertools.izip(*myList)
要从此迭代器创建列表,请执行以下操作:
map(list, itertools.izip(*myList))
答案 4 :(得分:0)
既然您提到了效率,我尝试使用PyPy和大约100x1000的某些地方,它们开始比zip
更好(在CPython上,但它们更糟糕):
myList = [[1, 2, 3],[4, 5, 6]]
newList = [[] for _ in xrange(len(myList[0]))]
for innerList in myList:
for elIdx in xrange(len(innerList)):
newList[elIdx].append(innerList[elIdx])
print newList
我的第一次尝试(更糟糕的是),但仍然比PyPy上的zip
更好:
newList = [[None for i in xrange(len(myList))] for j in xrange(len(myList[0]))]
for i in xrange(len(myList)):
for j in xrange(len(myList[i])):
newList[j][i] = myList[i][j]
print newList