如何在python中更改列表的主要顺序?

时间:2013-03-18 09:52:55

标签: python list

我有一个N个列表的列表,每个子列表包含M个元素。

如何创建一个包含N个元素的M列表列表,其中包含初始列表中的第n个元素?

让我说我有这个

myList = [[1, 2, 3],[4, 5, 6]]

我想要

[[1, 4],[2, 5],[3, 6]]

表现也很重要。我有数百万个元素的子列表(但是,一个维度总是很小:像1.000.000 x 8)

5 个答案:

答案 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 PythonTranspose/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()

的帮助下
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