[Tutor] Making Doubly Linked List with Less Lines of Code.

WolfRage wolfrage8765 at gmail.com
Fri Jan 2 19:56:17 CET 2015


On 01/02/2015 12:08 PM, Dave Angel wrote:
>> class GameGrid():
>>      def __init__(self, cols=8, rows=7, **kwargs):
>
> You probably want to reverse the order of the parameters;  you've got
> almost everything else row-major
>
You are right, a lot of inconsistency that will lead to errors latter 
on. I need to make everything column-major. So that the grid (x,y) are 
the same to grid (col,row). I have too much confusion throughout my 
code, so I will correct the code.

> Since both stages are being done in the same method, you don't need the
> part which initializes to None.
>
>      def make_grid(self):
>          # grid is 2d array as x, y ie [x][y].
>          self.grid = []
>          for row_num in range(self.rows):
>              self.grid.append( [GameTile(row=row_num, col=col_num)  for
> col_num in range(self.cols)] )
>
Implemented the second version.
>>
>>      def print_by_row(self):
>>          for col in self.grid:
>>              for row in col:
>>                  print(row)
>
> This cannot work.  The items in self.grid are rows.  Calling one of them
> col doesn't make it so.  In other words, the method as written will do
> exactly what print_by_col() does.

Good point, I did not read the output thoroughly enough to catch this.
>
> Try the following:
>
>      def print_by_row(self):
>          for col_number in range(self.cols):
>              for row in self.grid:
>                  print(row[col_number])
>
Implemented.
>
> This one should work fine.  But one of the names could be improved:
>
>
>      def print_by_col(self):
>          for row in self.grid:
>              for tile in row:
>                  print(tile)
>
Thanks, improved.

> All code untested.  i hope it helps.
>
Definitely. Thanks.

I have updated the code and I realized that all of my earlier confusion 
was even greater, so I have also added comments to make things make 
sense. Now the print_by_ methods work as I envision and in accordance 
with the comments.

import sys


class GameTile():
     def __init__(self, col, row, **kwargs):
         # id is grid (X,Y) which is equal to grid (col,row)
         self.id = str(col) + ',' + str(row)
         self.col = col
         self.row = row

     def __str__(self):
         return '%d, %d' % (self.col, self.row)


class GameGrid():
     def __init__(self, cols=8, rows=7, **kwargs):
         self.cols = cols
         self.rows = rows
         self.make_grid()

     def make_grid(self):
         # grid is 2d array as x, y ie [x][y].
         self.grid = []
         for row_num in range(self.rows):
             self.grid.append([GameTile(col=col_num, row=row_num) for
                 col_num in range(self.cols)])

     def print_by_col(self):
         # As in going down the column assuming we started at the top.
         for col_num in range(self.cols):
             for row in self.grid:
                 print(row[col_num])

     def print_by_row(self):
         # As in going right across the row assuming we started at the left.
         for row in self.grid:
             for node in row:
                 print(node)

     def check_bounds(self, x, y):
         return (0 <= x < self.rows) and (0 <= y < self.cols)

     def lookup_node(self, x, y):
         if not self.check_bounds(x, y):
             return False
         return self.grid[x][y]

     def draw(self):
         for col in self.grid:
             print(end='| ')
             for row in col:
                 print(row, end=' | ')
             print()


grid = GameGrid(3, 3)
grid.draw()
print(sys.getsizeof(grid.grid))
print()
grid.print_by_row()
print()
grid.print_by_col()



More information about the Tutor mailing list