按索引对列表中的列表元素进行分组

时间:2011-06-26 09:20:12

标签: python list

我正在尝试获取列表列表,并返回列表列表,其中包含原始列表列表索引处的每个元素。我知道那个措辞严厉。这是一个例子。

说我有以下列表清单:

[[1,2,3], [4,5,6], [7,8,9]]

我想获得另一个列表列表,其中每个列表是特定索引处每个元素的列表。例如:

[[1,2,3], [4,5,6], [7,8,9]] becomes [[1,4,7], [2,5,8], [3,6,9]]

因此,返回列表中的第一个列表包含每个原始列表的第一个索引处的所有元素,依此类推。我被卡住了,不知道如何做到这一点。任何帮助,将不胜感激。感谢。

5 个答案:

答案 0 :(得分:8)

>>> [list(t) for t in zip(*[[1,2,3], [4,5,6], [7,8,9]])]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

答案 1 :(得分:2)

也许一个简单的方法是:

a=[[1,2,3], [4,5,6], [7,8,9]]
b=zip(*a)

b将等于[(1,4,7),(2,5,8),(3,6,9)]。 希望这有帮助

答案 2 :(得分:2)

Dan D's answer是正确的,可以在Python 2中使用。 x 和Python 3. x

如果你正在进行大量的矩阵运算,而不仅仅是换位,那么在这个时刻值得考虑Numpy

>>> import numpy as np
>>> x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> np.swapaxes(x, 0, 1)
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])

或者,更简单地说,根据评论,使用numpy.transpose()

>>> np.transpose(x)
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])

答案 3 :(得分:0)

zip(*lists)方法外,您还可以使用列表推导:

[[l[i] for l in lists] for i in range(3)]

答案 4 :(得分:0)

如果您想简单地转置矩阵-e.g.要获得新的矩阵,其中行是来自初始矩阵的cols,而列等于初始矩阵行值,那么您可以使用:

initMatr = [
            [1,2,3],
            [4,5,6],
            [7,8,9]
           ]
map(list, zip(*initMatr))


>>> [
     [1,4,7],
     [2,5,8],
     [3,6,9]
    ]

或者如果你想要旋转矩阵,那么:

map(list, zip(*map(lambda x: x[::-1], initMatr)

>>> [
       [3,6,9],
       [2,5,8],
       [1,4,7]       
    ]