如何在没有可用库函数的情况下将列转换为行(Python)

时间:2017-07-08 10:43:49

标签: python sorting

所以我有这个,只有当列数(我的子列表中的元素数量)等于我想要创建的行数时才有效。

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

for i in range(len(list1)):
    columns.append([row[i] for row in list1])

我试过这个让它变得通用,这意味着它会接受列表长度和子列表长度的任意组合(例如[[1,2,3,4,5],[2,3,4,5,6] ]])但我得到的错误是没有定义j。

for i,j in range(len(list1[i][j])):
    columns.append([row[i] for row in list1])

如何更改此功能以使其正常工作? 我的列表必须是NxM矩阵,我不能使用min,max,zip等任何快捷方式。

1 个答案:

答案 0 :(得分:2)

这会奏效。主要思想是在适当的时间创建一个空的总体结果列表和空子列表并附加到它们。请注意,输入矩阵的大小为m x nm行和n列,这是表示矩阵大小的标准方法。结果的大小为n x m。如果您愿意,可以交换mn名称以与您的课程或书籍相对应。

m, n = len(list1), len(list1[0])
result = []
for col in range(n):
    result.append([])
    for row in range(m):
        result[col].append(list1[row][col])

如果你不喜欢临时空列表或附加,那么通常在Python以外的语言中使用的替代方法是创建适当大小的临时结果矩阵,然后填写正确的条目,如下所示: / p>

m, n = len(list1), len(list1[0])
result = [[None] * m for col in range(n)]
for col in range(n):
    for row in range(m):
        result[col][row] = list1[row][col]

此外,还有更简洁但更难理解的列表理解:

[[list1[row][col] for row in range(len(list1))] for col in range(len(list1[0]))]

所有这一切,Python中更好的方法是

result = list(map(list, (zip(*list1))))

(最后包括@cᴏʟᴅsᴘᴇᴇᴅ的修正。)