Сетка изображения персонажа - PullRequest
0 голосов
/ 30 мая 2020

Это мой первый вопрос в stackoverflow. Рад присоединиться к сообществу

Это вопрос из одной из книг:

Допустим, у вас есть список списков, где каждое значение во внутренних списках представляет собой строку из одного символа c , вот так:

grid = [['.', '.', '.', '.', '.', '.'],
    ['.', '0', '0', '.', '.', '.'],
    ['0', '0', '0', '0', '.', '.'],
    ['0', '0', '0', '0', '0', '.'],
    ['.', '0', '0', '0', '0', '0'],
    ['0', '0', '0', '0', '0', '.'],
    ['0', '0', '0', '0', '.', '.'],
    ['.', '0', '0', '.', '.', '.'],
    ['.', '.', '.', '.', '.', '.']]

результат должен быть:

..00.00..
.0000000.
.0000000.
..00000..
...000...
....0....

Мне удалось получить ответ с помощью этого кода:

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

Однако, даже если это решает проблему, но по какой-то причине я получаю следующую ошибку: Щелкните здесь, чтобы увидеть изображение ошибки

Когда я пишу следующее print (x, y); он показывает точно правильный номер диапазона, который я использовал в l oop ... который равен (0,8), но все же он дает мне выход за пределы диапазона.

Ответы [ 3 ]

1 голос
/ 30 мая 2020

Это не работает, потому что сетка не квадратная. len(grid) - 9, но len(grid[x]) (для всех x) - только 6!

Менее подверженный ошибкам способ написать итерацию по 2d списку - просто перебрать элементы каждого list:

for row in grid:
    for cell in row:
        print(cell, end="")
    print("")

Запустив это, я вижу, что изображение перевернуто на бок - к счастью, не так уж сложно транспонировать 2-й список с map и zip!

for row in map(list, zip(*grid)):
    for cell in row:
        print(cell, end="")
    print("")

Или используйте join, чтобы просто превратить все в одну строку:

print("\n".join("".join(row) for row in map(list, zip(*grid))))
0 голосов
/ 30 мая 2020

Проблема ее в том, что ваша сетка не квадратная. У вас есть 9 рядов по 6 элементов в каждом. Тем не менее, в обоих ваших циклах вы повторяете один и тот же диапазон индексов. Чтобы исправить это, используйте код:

Num_of_grid = range(len(grid))
Num_of_item = range(len(grid[0]))
for y in Num_of_item:
    for x in Num_of_grid:
        print(grid[x][y], end = "")
    print("")

А еще лучше используйте numpy, чтобы создать массив, транспонировать его и распечатать результат следующим образом:

import numpy as np
g = np.array(grid)
print("\n".join("".join(l) for l in g.T))
0 голосов
/ 30 мая 2020

Добро пожаловать в сообщество SO.

Итак, я думаю, что было бы лучше переоценить, как мы печатаем из нашего 2-мерного массива / сетки.

Num_of_grid после того, как выражение оценивается, итерация вроде этого: [0, 1, 2, 3, 4, 5, 6, 7, 8]. Вы используете этот диапазон для итераций x и y, даже если по горизонтали ваша фигура / сетка имеет ширину всего 6. Тогда происходит то, что в вашем операторе печати вы пытаетесь получить доступ к [y], которого не существует. Например, как grid[x][6] (7-я). Как и ожидалось, вы получите IndexError, а это именно то, что мы ожидали.

Итак, как лучше всего перебирать 2-й список?

Я мог бы предложить что-нибудь более лаконичное:

grid = [...]

for row in grid:
    for cell in row:
        print(cell, end="")
    print()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...