Character Picture Grid (from Automate the Boring Stuff) Sorry, I'm new and not confident.  This is right, yes?  It seems to work but, again, other people's answers seem more complicated:
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', '.', '.', '.'],
    ['.', '.', '.', '.', '.', '.']
]

row = 0
for entry in grid:
    for subentry in grid[row]:
        print(subentry, end = &quot;&quot;)
    print(&quot;\n&quot;)
    row = row + 1
The question itself
It's not great. The textbook makes some decisions that haven't done the programmer any favours. First, you will notice that the input and output are mirrored about the line \$x=y\$. This is not a coincidence: it's the result of the textbook using column-major order when row-major order makes much more sense in this context.
Also, the grid presented is not only a sequence of sequences, it's a sequence of sequences of sequences since there are inner strings.
To solve both problems, ignore what the textbook tells you and instead attempt to code for this grid:
grid = (
    '..OO.OO..',
    # ...
)

and use [y][x] indexing instead of [x][y] indexing.
Such changes will reduce this to a much more trivial problem that does not require any explicit loops, and can be done via
print('\n'.join(grid))