#####################################
class MDarray( list ): # version 12.5.11
"""Allow multi-dimensional tuples to be passed as indexes to a list.
All other operations must use real indexes, which can be calculated
using index_from_tuple().
The constructor requires a tuple of positive integers to define the
dimensions of the array (and hence the size of the underlying list).
The size of the list should not be changed, to keep the multi-dimensional
nature intact.
"""
def __init__( self, dims, init=None ):
if isinstance( dims, tuple ):
self.dims = dims
else:
self.dims = (dims, dims)
self.size = 1
for ix in self.dims:
if ix < 1:
raise ValueError('each dimension must be a positive integer')
self.size *= ix
list.__init__( self, [ init ] * self.size )
def index_from_tuple( self, dims ):
rix = dims[ 0 ]
for iy in range( len( self.dims ) - 1 ):
rix = rix * self.dims[ iy ] + dims[ iy + 1 ]
return rix
def __getitem__( self, ix ):
if isinstance( ix, tuple ):
rix = self.index_from_tuple( ix )
else:
rix = ix
return list.__getitem__( self, rix )
def __setitem__( self, ix, val ):
if isinstance( ix, tuple ):
rix = self.index_from_tuple( ix )
else:
rix = ix
list.__setitem__( self, rix, val )
def __repr__( self ):
return ( list.__repr__( self )
+ ' dims: ' + self.dims.__repr__()
+ ' size: ' + self.size.__repr__()
)
#####################################
Diff to Previous Revision
--- revision 1 2012-05-12 05:51:38
+++ revision 2 2012-05-12 06:21:11
@@ -16,7 +16,7 @@
self.size = 1
for ix in self.dims:
if ix < 1:
- raise glu.Exc('each dimension must be a positive integer')
+ raise ValueError('each dimension must be a positive integer')
self.size *= ix
list.__init__( self, [ init ] * self.size )
def index_from_tuple( self, dims ):