正确添加范围python

时间:2015-04-07 01:09:21

标签: python list matrix append

这是转置矩阵的代码的一部分,该函数接受一个参数,一个列表列表。我们假设输入是:

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

基本上,输出应该返回

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

等等任何矩阵。 以下代码返回

def matrix(data)
    column = len(data)
    transposed[0].append(data[0][0])
    transposed[0].append(data[1][0])
    transposed[0].append(data[2][0])
    outputs [1,4,7]

然而,当我尝试使其遵循colum length时,它会返回

   transposed[0].append(data[0:column][0])
   outputs [1,2,3]

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:5)

您可以使用内置函数zip转置矩阵:

def transpose(m):
    return zip(*m)

来自文档:

  

此函数返回元组列表,其中包含第i个元组   来自每个参数序列或迭代的第i个元素。该   返回的列表的长度被截断为最短的长度   论证序列。当有多个参数都是   相同的长度,zip()map()类似,初始参数为。{   None。使用单个序列参数,它返回一个1元组的列表。   没有参数,它返回一个空列表。

     

保证了迭代的从左到右的评估顺序。   这使得将数据序列聚类成成语成为可能   使用zip(*[iter(s)]*n)的n长度组。

要使其返回列表而不是元组列表,请返回以下列表解析:

[list(r) for r in zip(*m)]

以下是使用append:

的方法
def transpose(m):
    transposed = [[] for _ in range(len(m[0]))]
    for i in range(len(m)):
        for j in range(len(m[0])):
            transposed[j].append(m[i][j])
    return transposed

如您所见,使用zip要容易得多。 :)