2015-04-07 53 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