[Tutor] indexing lists

Michael P. Reilly arcege@shore.net
Mon, 5 Jun 2000 12:34:30 -0400 (EDT)


> 
> Hi everyone,
> 
> I'm wondering how, if even possible, you'd find the index of a given number
> in the following list of lists:
> 
> l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
> 
> I've been playing around with my little tic tac toe program, and I can't
> decide whether to use this list of lists structure for the matrix or a
> simpler [1, 2, 3, 4, 5, 6, 7, 8, 9] structure.
> 
> I think programming the strategy might be easier with the more 2-dimensional
> list of lists. But finding which moves are possible involves determining
> which places in the list are occupied by integers, not "X" or "O". I need to
> do l.index(spam) for that. Unfortunately, I can't do l.index(5). I can do
> l.index([1, 2, 3]), however. Is it possible to get at that 2nd layer of
> lists through an index statement?

Building a "Board" class can probably help you a great deal.

import types
from UserList import UserList

class Board(UserList):
  dimension = 3
  def __init__(self, dimension=None):
    UserList.__init__(self)
    if dimension is not None:
      self.dimension = int(dimension)
    # flesh out the board by putting in None's
    for i in range(self.dimension ** 2):
      self.append(None)
  def __getitem__(self, index):
    if isinstance(index, types.TupleType):
      (row, column) = index
      index = row * self.dimension + column
    return UserList.__getitem__(self, index)
  def __setitem__(self, index, value):
    if isinstance(index, types.TupleType):
      (row, column) = index
      index = row * self.dimension + column
    UserList.__setitem__(self, index, value)
  def index(self, value):
    position = UserList.index(self, value)
    row, column = divmod(position, self.dimension)
    return (row, column)

b = Board(4)
b[1,0] = 3
print b.index(3)
(1, 0)

Use the existing tools when you can, and think about what functions you
might need.  For example, clearing out the board.

  -Arcege


-- 
------------------------------------------------------------------------
| Michael P. Reilly, Release Manager  | Email: arcege@shore.net        |
| Salem, Mass. USA  01970             |                                |
------------------------------------------------------------------------