2015-04-07 56 views
1

这是用于转置矩阵的代码的一部分,函数带有一个参数列表。如果我们输入的假设:使用范围正确附加python

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

然而,当我试图让它遵循科拉姆长度返回,而不是

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

什么是错我的代码?

回答

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

下面介绍如何使用追加做到这一点:

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要容易得多。 :)

+0

我正式感到愚蠢._。无论如何,它如何使用我的语法工作? – Juanvulcano

+1

@Juanvulcano一秒钟,得编程吧。 xD – Shashank

+0

@Juanvulcano我们走了,我希望有所帮助。 – Shashank