转置列表清单

时间:2011-06-24 20:54:45

标签: python list transpose

我们来看看:

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

我正在寻找的结果是

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

而不是

r = [(1,4,7),(2,5,8),(3,6,9)]

非常感谢

13 个答案:

答案 0 :(得分:241)

怎么样

map(list, zip(*l))
--> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

对于python 3.x,用户可以使用

list(map(list, zip(*l)))

答案 1 :(得分:51)

一种方法是使用NumPy转置。对于列表,a:

>>> import numpy as np
>>> np.array(a).T.tolist()
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

或另一个没有拉链的人:

>>> map(list,map(None,*a))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

答案 2 :(得分:42)

等同于耶拿的解决方案:

>>> 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]]

答案 3 :(得分:23)

只是为了有趣,有效的矩形并假设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]]

答案 4 :(得分:17)

这些方法都适用于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]]

方法1

>>> map(list, six.moves.zip_longest(*list_list, fillvalue='-'))
[[1, 4, 7], [2, 5, 8], [3, 6, 9], ['-', 6.1, '-'], ['-', 6.2, '-'], ['-', 6.3, '-']]

six.moves.zip_longest()变为

默认填充值为None。感谢@ jena的answer,其中map()正在将内部元组更改为列表。在这里,它将迭代器转换为列表。感谢@ Oregano和@ badp的comments

方法2

>>> [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, '-']]

@inspectorG4dget alternative

方法3

>>> 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]]

这个非常紧凑的@SiggyF second alternative适用于参差不齐的2D列表,不像他的第一个使用numpy转置并通过不规则列表的代码。但无必须是填充值。 (不,传递给内部map()的None不是填充值。这意味着没有传递行的功能。)

答案 5 :(得分:2)

有三种选择:

1。使用Zip

映射
solution1 = map(list, zip(*l))

2。列表理解

solution2 = [list(i) for i in zip(*l)]

3。对于循环追加

solution3 = []
for i in zip(*l):
    solution3.append((list(i)))

并查看结果:

print(*solution1)
print(*solution2)
print(*solution3)

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

答案 6 :(得分:1)

也许不是最优雅的解决方案,但这里是使用嵌套while循环的解决方案:

def transpose(lst):
    newlist = []
    i = 0
    while i < len(lst):
        j = 0
        colvec = []
        while j < len(lst):
            colvec.append(lst[j][i])
            j = j + 1
        newlist.append(colvec)
        i = i + 1
    return newlist

答案 7 :(得分:0)

import numpy as np
r = list(map(list, np.transpose(l)))

答案 8 :(得分:0)

more_itertools.unzip()易于阅读,并且也适用于生成器。

import more_itertools
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
r = more_itertools.unzip(l) # a tuple of generators.
r = list(map(list, r))      # a list of lists

或等效地

import more_itertools
l = more_itertools.chunked(range(1,10), 3)
r = more_itertools.unzip(l) # a tuple of generators.
r = list(map(list, r))      # a list of lists

答案 9 :(得分:0)

matrix = [[1,2,3],
          [1,2,3],
          [1,2,3],
          [1,2,3],
          [1,2,3],
          [1,2,3],
          [1,2,3]]
    
rows = len(matrix)
cols = len(matrix[0])

transposed = []
while len(transposed) < cols:
    transposed.append([])
    while len(transposed[-1]) < rows:
        transposed[-1].append(0)

for i in range(rows):
    for j in range(cols):
        transposed[j][i] = matrix[i][j]

for i in transposed:
    print(i)

答案 10 :(得分:0)

方阵的另一种方法。没有 numpy,也没有 itertools,使用(有效的)就地元素交换。

def transpose(m):
    for i in range(1, len(m)):
        for j in range(i):
            m[i][j], m[j][i] = m[j][i], m[i][j]

答案 11 :(得分:-1)

这是一个用于转置不一定是正方形的列表列表的解决方案:

maxCol = len(l[0])
for row in l:
    rowLength = len(row)
    if rowLength > maxCol:
        maxCol = rowLength
lTrans = []
for colIndex in range(maxCol):
    lTrans.append([])
    for row in l:
        if colIndex < len(row):
            lTrans[colIndex].append(row[colIndex])

答案 12 :(得分:-2)

    #Import functions from library
    from numpy import size, array
    #Transpose a 2D list
    def transpose_list_2d(list_in_mat):
        list_out_mat = []
        array_in_mat = array(list_in_mat)
        array_out_mat = array_in_mat.T
        nb_lines = size(array_out_mat, 0)
        for i_line_out in range(0, nb_lines):
            array_out_line = array_out_mat[i_line_out]
            list_out_line = list(array_out_line)
            list_out_mat.append(list_out_line)
        return list_out_mat