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

Danny Yoo dyoo at hashcollision.org
Thu Dec 25 06:15:25 CET 2014


Quick comment: the structure of the code here catches my eye:


>         # Each variable below is a link to the head Node in the respective
>         # row or column.
>         self.row0 = None
>         self.row1 = None
>         self.row2 = None
>         self.row3 = None
>         self.row4 = None
>         self.row5 = None
>         self.row6 = None
>         self.row7 = None
>         self.row8 = None
>         self.row9 = None

It seems highly regular; the code here is maintaining a collection of
row variables.  Because it's so regular, you might consider using a
list to represent this collection.  Concretely:

    self.rows = [None, None, None, None, None, None, None, None, None, None]

We can express this more concisely in Python as:

    self.row = [None] * 10

Once we have this, then we can get at any particular row through its
offset.  So instead of:

    self.row0

we say:

    self.row[0]

The big win with a list representation is that the offset can be
computed.  So if we need to do an operation on each row, we might say:

    for i in range(10):
        ## ... Do something with self.row[i]

And if you see the full power of this, you'll realize that this allows
us to express loops to do something to _all_ the rows, expressing that
action just once.  Or if we need to do something for every other row,
that too is not too difficult to express:

    for i in range(0, 10, 2):
        ## ... Do something with self.row[i]


In contrast, doing the same thing without using an explicit container
representation means that doing container-wide actions is harder to
do.  This is the code smell that we saw at the beginning of this post,
where we see repetitive code.


More information about the Tutor mailing list