Python和数据结构学习 --- 1
今天就到了二维的了.Python中默认是没有带二维的数据结构的.二维的数据结构可以通过一维的数据组成.代码如下
class Array2D: def __init__(self,numRows,numCols): self._theRows = Array(numRows) for i in range(numRows): self._theRows[i] = Array(numCols) def numRows(self): return len(self._theRows) def numCols(self): return len(self._theRows[0]) def clear(self,value): for r in range(self.numRows()): self._theRows[r].clear(value) def __getitem__(self,ndxTuple): assert len(ndxTuple) == 2,"Invalid number of array subscripts" row = ndxTuple[0] col = ndxTuple[1] assert row >= 0 and row <self.numRows()\ and col >= 0 and col < self.numCols(),\ "Array subscript out of range" the1dArray = self._theRows[row] return the1dArray[col] def __setitem__(self,ndxTuple,value): assert len(ndxTuple) == 2,"Invalid number of array subscripts" row = ndxTuple[0] col = ndxTuple[1] assert row >= 0 and row <self.numRows()\ and col >= 0 and col < self.numCols(),\ "Array subscript out of range" the1dArray = self._theRows[row] the1dArray[col] = value
注意下调用形式,这里的是实现了 __getitem__ ,__setitem__,这里是这样调用的 如a = Array2D(2,3) a[1,2] = 5
当然也可以像c/c++那样,改写下__getitem__
def __getitem__(self,row): return self._thwRows[row]
这时调用就是这样子 val = a[1][2] 和a[1,2] = val,连__setitem__都不要写了.相当于2次函数调用.
说到二维数组自然想到矩阵(Matrix).
当然实际使用时是直接使用numpy庫拉.
实现代码如下,其实只是在Array2D上加了几个简单的操作而已.
from array import Array2D class Matrix: def __init__(self,numRows,numCols): self._theGrid = Array2D(numRows,numCols) self._theGrid.clear(0) def numRows(self): return self._theGrid.numRows() def numCols(self): return self._theGrid.numCols() def __getitem__(self,ndxTuple): return self._theGrid[ndxTuple[0],ndxTuple[1]] def __setitem__(self,ndxTuple,scalar): self._theGrid[ndxTuple[0],ndxTuple[1]] = scalar def scaleBy(self,scalar): for r in range(self.numRows()): for c in range(self.numCols()): self[r,c] *= scalar def tranpose(self): newMatrix = Matrix(self.numCols(),self.numRows()) for r in range(self.numRows()): for c in range(self.numCols()): newMatrix[c,r] = self._theGrid[r,c] return newMatrix def __add__(self,rhsMatrix): assert rhsMatrix.numRows() == self.numRows() and \ rhsMatrix.numCols() == self.numCols(),\ "Matrix sizes not compatible for the add operation" newMatrix = Matrix(self.numRows(),self.numCols()) for r in range(self.numRows()): for c in range(self.numCols()): newMatrix[r,c] = self[r,c] + rhsMatrix[r,c] return newMatrix def __sub__(self,rhsMatrix): assert rhsMatrix.numRows() == self.numRows() and \ rhsMatrix.numCols() == self.numCols(),\ "Matrix sizes not compatible for the add operation" newMatrix = Matrix(self.numRows(),self.numCols()) for r in range(self.numRows()): for c in range(self.numCols()): newMatrix[r,c] = self[r,c] - rhsMatrix[r,c] return newMatrix def __mul__(self,rhsMatrix): assert rhsMatrix.numRows() == self.numCols() ,\ "Matrix sizes not compatible for the add operation" newR = self.numRows() newC = rhsMatrix.numCols() newK = self.numCols() newMatrix = Matrix(newR,newC) for r in range(newR): for c in range(newC): temp = 0 for k in range(newK): temp += self._theGrid[r,k]*rhsMatrix[k,c] newMatrix[r,c] = temp return newMatrix
测试也很简单.
嗯,好了睡觉...