2016-05-18 415 views
1

我想創建這樣的矩陣:創建矩陣在Python 3

[[0, 1, 2, 3, 4, 5], [1, 0, 1, 2, 3, 4], [2, 1, 0, 1, 2, 3], [3, 2, 1, 0, 1, 2], [4, 3, 2, 1, 0, 1],[5, 4, 3, 2, 1, 9]] 

我的嘗試是:

[[x if x<=5 else x-5 for x in range(x,5+x)] for x in range(1,6)] 

,但我給了我一點點的其他結果:

[[1, 2, 3, 4, 5], [2, 3, 4, 5, 1], [3, 4, 5, 1, 2], [4, 5, 1, 2, 3], [5, 1, 2, 3, 4]] 

我應該在我的代碼中更改什麼?

P.S我想用列表解析,列表操作和lamda的。沒有numpy和其他科學軟件包。

回答

2

假設在過去的列表中9是一個錯字,你似乎是在尋找

[[abs(i) for i in range(j, j+6)] for j in range(0, -6, -1)] 

這在我的機器上給出結果

[[0, 1, 2, 3, 4, 5], [1, 0, 1, 2, 3, 4], [2, 1, 0, 1, 2, 3], [3, 2, 1, 0, 1, 2], [4, 3, 2, 1, 0, 1], [5, 4, 3, 2, 1, 0]] 
1
[[abs(j) for j in range(0-i,6-i)] for i in range(6)] 
0

有沒有必要使用一個if表達式。 「訣竅」是生成倒數爲零的數字作爲負數,然後使用abs函數將它們轉換爲正數;已經爲正數的數字將不受影響。

size = 6 
r = range(size) 
m = [[abs(j-i) for j in r] for i in r] 

for row in m: 
    print(row) 

輸出

[0, 1, 2, 3, 4, 5] 
[1, 0, 1, 2, 3, 4] 
[2, 1, 0, 1, 2, 3] 
[3, 2, 1, 0, 1, 2] 
[4, 3, 2, 1, 0, 1] 
[5, 4, 3, 2, 1, 0] 

當然,可以在一行中產生的矩陣:

m = [[abs(j-i) for j in range(6)] for i in range(6)] 

但前面的代碼是稍微更好,因爲它重新使用一個單一的而不是在每個內部循環上創建新的範圍對象。