Initialize a 2D Array in a Class in Python
我尝试在python中创建一个3x3矩阵类。我很难正确初始化二维数组。
在下面的代码中,我得到一个错误,说matrix3x3没有属性m。如果我在in it之前初始化m,它看起来像是一个静态变量,我不想这样。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Matrix3x3: #[1 0 0] #[0 1 0] #[0 0 1] def __init__(self, m): #self.m[row][column] self.m[0][0] = m[0][0]; self.m[0][1] = m[0][1]; self.m[0][2] = m[0][2]; self.m[1][0] = m[1][0]; self.m[1][1] = m[1][1]; self.m[1][2] = m[1][2]; self.m[2][0] = m[2][0]; self.m[2][1] = m[2][1]; self.m[2][2] = m[2][2]; |
问题是,在设置元素之前,
1 2 | lst = [] lst[0] = 0 |
会失败但
1 2 | lst = [] lst.append(0) |
会成功的。应将
然而,做你想做的事情的最简单的方法是用列表理解,
1 2 3 | class Matrix3x3: def __init__(self, m): self.m = [[m[i][j] for j in xrange(len(m[i]))] for i in xrange(len(m))] |
或者使用
1 2 3 4 5 | from copy import deepcopy class Matrix3x3: def __init__(self, m): self.m = deepcopy(m) |
此外,如果这不是为了某种类型的分配,您应该考虑使用
在设置元素之前,必须将m作为列表列表分配:
1 2 3 4 5 6 7 8 9 10 | class Matrix3x3: #[1 0 0] #[0 1 0] #[0 0 1] def __init__(self, m): #allocate the lists : m is a list containing 3 lists of 3 None values self.m = [ [ None for j in range(3) ] for i in range(3) ] for i in range(3): for j in range(3): self.m[i][j] = m[i][j]; |
或者更直接地说:
1 2 3 4 5 6 7 | class Matrix3x3: #[1 0 0] #[0 1 0] #[0 0 1] def __init__(self, m): # directly init self.m self.m = [ [ m[i][j] for j in range(3) ] for i in range(3) ] |
试试这个:
1 2 | matrix_size = 3 Matrix = [[1 if x==y else 0 for y in xrange(matrix_size)] for x in xrange(matrix_size)] |
Mayby一开始不是100%的readeble,但起作用:)
此类将生成矩阵3x3
1 2 3 4 5 6 7 8 9 10 | class Matrix3x3: def __init__(self): self.m = [] for item in range(3): self.m.append([0,0,0]) mat = Matrix3x3() print(mat.m) [[0, 0, 0], [0, 0, 0], [0, 0, 0]] |
它可以扩展以创建x大小的矩阵
1 2 3 4 5 6 7 8 9 | class Matrix_x_sized: def __init__(self,x): self.m = [] for item in range(x): self.m.append([0]*x) mat2 = Matrix_x_sized(4) mat2.m [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] |