2016-11-12 62 views
0

目前我有一個使用python的數據結構課程。在書中,他們已經包含了兩個不同的類來實現一維數組結構和二維數組。從python的2D數組類中創建一個對象

對於一維數組:

import ctypes 
class Array: 

def __init__(self, size): 
    assert size > 0, "Array size must be > 0" 
    self._size = size 
    PyArrayType = ctypes.py_object * size 
    self._elements = PyArrayType() 
    self.clear(None) 

def len(self): 
    return self._size 

def getitem(self, index): 
    assert index >= 0 and index < self.len(), "Array subscript out of range" 
    return self._elements[index] 

def setitem(self, index, value): 
    assert 0 <= index < self.len(), "Array subscript out of range" 
    self._elements[index] = value 

def clear(self, value): 
    for i in range(self.len()): 
     self._elements[i] = value 

def iter(self): 
    return ArrayIterator(self._elements) 

類ArrayIterator: DEF 初始化(個體,theArray): self._arrayRef = theArray self._curNdx = 0 DEF ITER(個體): return self def next(self): if self._curNdx < len(self._arrayRef): e n請= self._arrayRef [self._curNdx] self._curNdx + = 1次 回報進入 其他: 拋出StopIteration異常

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 row in range(self.numRows()): 
     row.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 

我用下面的代碼來了解它是如何工作:

arr = Array(5) 
    arrLen = arr.len() 
    arr.clear(0) 
    for i in range (arrLen): 
     print arr.getitem(i) 

    print "The length of the array = ",arrLen 

    print "Enter 5 numbers" 
    for i in range (arrLen): 
    #n = raw_input("num = ") 
    arr.setitem(i,i) 

    for i in range (arrLen): 
    print arr.getitem(i) 
    print"values are ", arr.iter() 

但是,我不知道如何調用二維數組來了解它是如何工作的。

ArrMulti = Array2D(3, 4) 

,我得到了以下錯誤:

File "MultiArrayADT.py", line 46, in __init__ 
self._theRows[i] = Array(numCols) 
AttributeError: Array instance has no attribute '__setitem__' 

所以請有人可以告訴我如何創建一個二維數組對象。

回答

0

在您的Array類中,您應該覆蓋方法__setitem__(),而您已實施setitem()。所以請嘗試更改方法的名稱。這應該工作。與getitem()相同。