[Tutor] Making Doubly Linked List with Less Lines of Code.
WolfRage
wolfrage8765 at gmail.com
Tue Dec 30 19:47:49 CET 2014
This is my most recent rendition of the code. It still needs to be
improved. Below I am answering some questions that were posed. Also I
think my code is currently wrong because I think the print_by functions
are both printing the list the same way. Tomorrow I will fix this and
improve the code.
Thank you guys for your help so far.
class GameTile():
def __init__(self, id, **kwargs):
self.id = id
self.value = None
self.next_node_in_row = None
self.next_node_in_col = None
self.prev_node_in_row = None
self.prev_node_in_col = None
class GameGrid():
def __init__(self, **kwargs):
self.num_of_cols = 8
self.num_of_rows = 10
# Each variable below is a list of links to the head
# node in the respective row or column.
self.rows = [None] * self.num_of_rows
self.cols = [None] * self.num_of_cols
self.skip_to_row = None
self.skip_to_col = None
self.tile_list = list()
def make_grid_nodes(self):
for row in range(0, self.num_of_rows):
for column in range(0, self.num_of_cols):
tile = GameTile(id=str(column) + ',' + str(row))
self.tile_list.append(tile)
if column == 0: # New Head of Row
self.rows[row] = tile
else:
prev_row.next_node_in_row = tile
tile.prev_node_in_row = prev_row
prev_row = tile
if row == 0: # New Head of Column
self.cols[column] = tile
else:
prev_col.next_node_in_col = tile
tile.prev_node_in_col = prev_col
prev_col = tile
def print_by_rows(self):
for col, the_column in enumerate(self.cols):
print(the_column.id)
if the_column.next_node_in_row is not None:
node = the_column.next_node_in_row
while node.next_node_in_row is not None:
print(node.id)
node = node.next_node_in_row
def print_by_row(self):
for row in self.rows:
print(row.id)
if row.next_node_in_row is not None:
node = row.next_node_in_row
while node.next_node_in_row is not None:
print(node.id)
node = node.next_node_in_row
def print_by_col(self):
for col in self.cols:
print(col.id)
if col.next_node_in_col is not None:
node = col.next_node_in_col
while node.next_node_in_col is not None:
print(node.id)
node = node.next_node_in_col
def draw_grid(self):
import time
sep = '─────────────────'
f = '░│'
l = '◈│'
row = sep + '\n│'
last_col = None
current_col = None
val = None
for node in self.tile_list:
if node.value == None:
val = l
else:
val = f
current_col = node.id.split(',')[1]
if last_col is None:
row += val
elif current_col == last_col:
row += val
else:
row += '\n' + sep + '\n│' + val
last_col = node.id.split(',')[1]
row += '\n' + sep
print(row)
#time.sleep(1)
temp = GameGrid()
temp.make_grid_nodes()
#temp.draw_grid()
temp.print_by_row()
print('BREAK Now COLUMNS')
temp.print_by_col()
On 12/25/2014 12:31 AM, Danny Yoo wrote:
> What are the _operations_ you want to support? Can you say more about this?
I need to support lookups, no insertions or deletions are required. This
code will be used to quickly lookup nodes, and check for specific
patterns by checking the nodes values in either a row or column. The
code to perform the pattern matching was already written and is fast,
but I will add it to the code once the creation
On 12/24/2014 04:56 PM, Steven D'Aprano wrote:
> Wow. It certainly is bloated.
Agreed.
> Look for the opportunity to write code like this instead of using range:
>
> for col, the_column in enumerate(self.columns):
> self.columns[col] = process(the_column)
This caught my eye, and I did try to implement it. But why use this
instead of range? I am using Python3. I did find that enumerate is
potentially faster but sometimes slower, as it depends on what is being
done. Perhaps because it is considered more Pythonic? So what is your
reason for this suggestion?
> Any time you write more than a trivial amount of code twice, you should
> move it into a function. Then, instead of:
I agree, should have done, and need to look for these opportunities sooner.
More information about the Tutor
mailing list