# 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))))
``````