2016-05-18 206 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)] 

但前面的代码是稍微更好,因为它重新使用一个单一的而不是在每个内部循环上创建新的范围对象。