Another way to do it is using a dict with keys that are tuples: >>> arr = {} >>> arr[0,0] = 'a1' >>> arr[0,1] = 'a2' >>> arr[1,0] = 'b1' >>> arr[1,1] = 'b2' >>> arr[2,0] = 'c1' >>> arr[2,1] = 'c2' >>> for j in range(3): ... for i in range(2): ... print arr[j,i], ' ', ... print ... a1 a2 b1 b2 c1 c2 >>>
You can derive a class from dict that implements desired behaviors (e.g. bounds checking, nrows and ncols attributes). Using this approach over lists of lists is nice: old fogey scientific programmers like me prefer the explicit [j,i] syntax over the [j][i] way, and it's easily extensible over more than two dimensions ([k][j][i]??? Yikes!). This is perhaps not preferred for a "full" matrix (I'd tend to use a NumPy array of Objects), but it can be useful. I've used it in two cases: -- A "sparse" matrix (overload dict.__getitem__ to return 0 if the tuple (j,i) is not a valid key), -- A "multidimensional array" in which all the indices are strings, like a table with column labels and row labels (in my case, it was a 3-dimensional "table" with a concatenated key of three text strings but there were reasons not to use a relational database). It was very convenient to implement the code in this way, and extremely readable. This trick is also useful with dbm files, e.g. using shelve. --vic -- http://mail.python.org/mailman/listinfo/python-list