0

Currently I'm having a data structure course using python. In the book, they have included two different classes to implement the 1D array structure and the 2D array.

For 1D array:

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 )

class ArrayIterator:
    def __init__(self, theArray):
        self._arrayRef = theArray
        self._curNdx = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self._curNdx < len(self._arrayRef):
            entry = self._arrayRef[self._curNdx]
            self._curNdx += 1
            return entry
        else:
            raise 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

I use the following code to understand how it works:

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()

However, I didn't know how to call the 2D array to understand how it works.

ArrMulti = Array2D(3, 4)

and I got the following error:

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

So please can someone tell me how to create a 2D array object.

1 Answer 1

2

In your Array class you should override method __setitem__(), while you have implemented setitem(). So try to change a name of the method. That should work. Same with getitem().

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.