You can create small class with handle table thing and use dictionary
as the main data.
Look at this code:

class mytable:
  def __init__(self):
    self.dat = {}
    pass
  def input(self,row,col,val):
    self.dat[row] = {col:val}
    pass
  def output(self,row,col):
    try: return self.dat[row][col]
    except: return None
    pass

if __name__ == '__main__':
  mytab = mytable()
  mytab.input(1,'A','cat')
  
  # Ok
  print mytab.output(1,'A') # it will result 'cat'
  
  # Not Ok --> No Data
  print mytab.output(2,'B') # it will result None


Sincerely Yours,
Pujo Aji

On 5/28/05, Kent Johnson <[EMAIL PROTECTED]> wrote:
> Marcus Goldfish wrote:
> > Before I try to reinvent the wheel, can anyone point me to a data
> > structure suitable for storing non-numeric, 2-d arrays.  For instance,
> > something that can store the following:
> >
> >         A      B      C      D
> >  1   'cat'     3    object  9
> >  J    4      [1]     5        6
> >
> > where the column and row labels in this example are ['A','B','C','D']
> > and [1,'J'], respectively.  I need to access (set and get values) by
> > cell, row, and column.
> >
> > I have a solution using 2-tuple keys and a dict, e.g., d[('A',1)], but
> > it seems kludgy and doesn't handle the row/column access.
> >
> > Any pointers or code snippets would be appreciated!
> 
> You caught me in a good mood this morning. I woke to sunshine for the first 
> time in many days, that
> might have something to do with it :-)
> 
> Here is a dict subclass that extends __getitem__ and __setitem__ to allow 
> setting an entire row. I
> included extensive doctests to show you what it does.
> 
> Note: you can write d['A',1] instead of d[('A',1)], which looks a little 
> cleaner.
> 
> Kent
> 
> class Grid(dict):
>      """
>      A two-dimensional array that can be accessed by row, by column, or by 
> cell.
> 
>      Create with lists of row and column names plus any valid dict() 
> constructor args.
> 
>      >>> data = Grid( ['A', 'B'], [1, 2] )
> 
>      Row and column lists must not have any values in common.
> 
>      >>> data = Grid([1, 2], [2, 3])
>      Traceback (most recent call last):
>      ...
>      ValueError: Row and column lists must not have any values in common
> 
>      Here is an example with data:
> 
>      >>> rowNames = ['A','B','C','D']
>      >>> colNames = [1,'J']
>      >>> rawData = [ 'cat', 3, object, 9, 4, [1], 5, 6 ]
>      >>> indices = [ (row, col) for col in colNames for row in rowNames ]
>      >>> data = Grid(rowNames, colNames, zip(indices, rawData))
> 
> 
>      Data can be accessed by cell:
> 
>      >>> for i in indices:
>      ...    print i, data[i]
>      ('A', 1) cat
>      ('B', 1) 3
>      ('C', 1) <type 'object'>
>      ('D', 1) 9
>      ('A', 'J') 4
>      ('B', 'J') [1]
>      ('C', 'J') 5
>      ('D', 'J') 6
> 
>      >>> data['B', 'J'] = 5
> 
> 
>      Cell indices must contain valid row and column names:
> 
>      >>> data[3]
>      Traceback (most recent call last):
>      ...
>      KeyError: 3
> 
>      >>> data['C', 2] = 5
>      Traceback (most recent call last):
>      ...
>      ValueError: Invalid key or value: Grid[('C', 2)] = 5
> 
> 
>      Data can be accessed by row or column index alone to set or retrieve
>      an entire row or column:
> 
>      >>> print data['A']
>      ['cat', 4]
> 
>      >>> print data[1]
>      ['cat', 3, <type 'object'>, 9]
> 
>      >>> data['A'] = ['dog', 2]
>      >>> print data['A']
>      ['dog', 2]
> 
> 
>      When setting a row or column, data must be the correct length.
> 
>      >>> data['A'] = ['dog']
>      Traceback (most recent call last):
>      ...
>      ValueError: Invalid key or value: Grid['A'] = ['dog']
> 
>      """
> 
>      def __init__(self, rowNames, colNames, *args, **kwds):
>          dict.__init__(self, *args, **kwds)
>          self.rowNames = list(rowNames)
>          self.colNames = list(colNames)
> 
>          # Check for no shared row and col names
>          if set(rowNames).intersection(colNames):
>              raise ValueError, 'Row and column lists must not have any values 
> in common'
> 
>      def __getitem__(self, key):
>          if self._isCellKey(key):
>              return dict.__getitem__(self, key)
> 
>          elif key in self.rowNames:
>              return [ dict.__getitem__(self, (key, col)) for col in 
> self.colNames ]
> 
>          elif key in self.colNames:
>              return [ dict.__getitem__(self, (row, key)) for row in 
> self.rowNames ]
> 
>          else:
>              raise KeyError, key
> 
> 
>      def __setitem__(self, key, value):
>          if self._isCellKey(key):
>              return dict.__setitem__(self, key, value)
> 
>          elif key in self.rowNames and len(value) == len(self.colNames):
>              for col, val in zip(self.colNames, value):
>                  dict.__setitem__(self, (key, col), val)
> 
>          elif key in self.colNames and len(value) == len(self.rowNames):
>              for row, val in zip(self.rowNames, value):
>                  dict.__setitem__(self, (row, key), val)
> 
>          else:
>              raise ValueError, 'Invalid key or value: Grid[%r] = %r' % (key, 
> value)
> 
> 
>      def _isCellKey(self, key):
>          ''' Is key a valid cell index? '''
>          return isinstance(key, tuple) \
>              and len(key) == 2 \
>              and key[0] in self.rowNames \
>              and key[1] in self.colNames
> 
> 
> if __name__ == '__main__':
>      import doctest
>      doctest.testmod()
> 
> 
> _______________________________________________
> Tutor maillist  -  [email protected]
> http://mail.python.org/mailman/listinfo/tutor
>
_______________________________________________
Tutor maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/tutor

Reply via email to