Automate The Boring Stuff – Character Picture Grid

Posted on

Problem

I understand there is another question on this already, however this is what I coded and wanted to know if this would raise any red flags?

Regarding the Character picture exercise located at the end the following page:
https://automatetheboringstuff.com/chapter4/

Say you have a list of lists where each value in the inner lists is a
one-character string, like this:

grid = [['.', '.', '.', '.', '.', '.'],
        ['.', 'O', 'O', '.', '.', '.'],
        ['O', 'O', 'O', 'O', '.', '.'],
        ['O', 'O', 'O', 'O', 'O', '.'],
        ['.', 'O', 'O', 'O', 'O', 'O'],
        ['O', 'O', 'O', 'O', 'O', '.'],
        ['O', 'O', 'O', 'O', '.', '.'],
        ['.', 'O', 'O', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.']]

You can think of grid[x][y] as being the character at the x- and
y-coordinates of a “picture” drawn with text characters. The (0, 0)
origin will be in the upper-left corner, the x-coordinates increase
going right, and the y-coordinates increase going down.

Copy the previous grid value, and write code that uses it to print the
image.

..OO.OO..
.OOOOOOO.
.OOOOOOO.
..OOOOO..
...OOO...
....O....

It’s different in that it doesn’t hard-code the length of the list.

grid = [['.', '.', '.', '.', '.', '.'],
        ['.', 'O', 'O', '.', '.', '.'],
        ['O', 'O', 'O', 'O', '.', '.'],
        ['O', 'O', 'O', 'O', 'O', '.'],
        ['.', 'O', 'O', 'O', 'O', 'O'],
        ['O', 'O', 'O', 'O', 'O', '.'],
        ['O', 'O', 'O', 'O', '.', '.'],
        ['.', 'O', 'O', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.']]

x = 0
y = 0

for y in range(len(grid[x])):
    for x in range(len(grid)):
        print(grid[x][y],end='')
    print()

Thanks for the help and let me know if this is not appropriate to post!

Solution

It’s wasteful to use range() and then only use the result for indexing.

Instead, just iterate directly over the values:

for col in range(len(grid[0])):
    for row in grid:
        print(row[col],end='')
    print()

We can simplify, though – use the zip function to transpose the array:

transposed = zip(*grid)

for row in transposed:
    for col in row:
        print(col,end='')
    print()

The next simplification is instead of printing one character at a time, we can use join to form strings for printing:

for row in zip(*grid):
    print(''.join(row))

And we can join all the rows using 'n'.join(), giving this final version:

print('n'.join(''.join(x) for x in zip(*grid)))

Equivalently, using map:

print('n'.join(map(''.join, zip(*grid))))

Leave a Reply

Your email address will not be published. Required fields are marked *