#python #python-3.x
#python #python-3.x
Вопрос:
Как я могу добавить дополнение, состоящее из нулей, в 2D-массив (без использования каких-либо дополнительных модулей)?
Например, у меня есть следующая сетка:
1 0 1 1
0 1 1 0
1 0 0 1
1 0 1 1
Я бы хотел, чтобы результат был:
0 0 0 0 0 0
0 1 0 1 1 0
0 0 1 1 0 0
0 1 0 0 1 0
0 1 0 1 1 0
0 0 0 0 0 0
Я попробовал следующий код и его работу, но я хотел бы знать, есть ли лучший способ добиться этого.
def padded_grid(grid):
gridpadding = []
extrarow = [0] * (len(grid) 2)
gridpadding.append(extrarow)
for row in grid:
row.insert(0, 0)
row.append(0)
gridpadding.append(row)
gridpadding.append(extrarow)
return gridpadding
Комментарии:
1. это было бы намного элегантнее с
numpy
. Вы не возражаете его использовать?
Ответ №1:
Прочитайте вопрос неправильно, поэтому вы хотите установить, сколько отступов вы хотите, но я реализовал заполнение одного слоя. Проще всего было бы просто заполнить несколько итераций.
from pprint import pprint
source = [list(range(n, n 4)) for n in range(4)]
pprint(source, width=41)
def pad_frame_once(src_: list, pad) -> list:
output = [[pad, *line, pad] for line in src_]
return [[pad] * len(output[0]), *output, [pad] * len(output[0])]
def pad_grid(src_, padding_size: int, pad=0):
reference = src_
for _ in range(padding_size):
reference = pad_frame_once(reference, pad)
return reference
pprint(pad_frame_once(source, pad=0))
pprint(pad_grid(source, 3))
[[0, 1, 2, 3],
[1, 2, 3, 4],
[2, 3, 4, 5],
[3, 4, 5, 6]]
[[0, 0, 0, 0, 0, 0],
[0, 0, 1, 2, 3, 0],
[0, 1, 2, 3, 4, 0],
[0, 2, 3, 4, 5, 0],
[0, 3, 4, 5, 6, 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],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 2, 3, 0, 0, 0],
[0, 0, 0, 1, 2, 3, 4, 0, 0, 0],
[0, 0, 0, 2, 3, 4, 5, 0, 0, 0],
[0, 0, 0, 3, 4, 5, 6, 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, 0, 0, 0, 0, 0, 0]]
Process finished with exit code 0
Комментарии:
1. Примечание: забыл добавить
pad
параметр вpad_grid
. Обычно вы хотите изменить объект заполнения без редактирования исходного кода, я обновлю его.2. Опять же, еще один недостаток — измените
reference = src_
reference = src_[:]
на копировать список, или это просто передаст ссылку на исходный список и внесет изменения непосредственно в него.
Ответ №2:
Без каких-либо других библиотек вы могли бы использовать следующее, предполагая, что 2-d массив называется l
:
l = [[1, 0, 1, 1],
[0, 1, 1, 0],
[1, 0, 0, 1],
[1, 0, 1, 1]]
def padded_grid(grid):
n = len(grid[0])
x = [0 for _ in range(n 2)]
[lst.append(0) for lst in grid]
[lst.insert(0, 0) for lst in grid]
grid.insert(0,x)
grid.append(x)
return grid
padded_grid(grid=l)
[[0, 0, 0, 0, 0, 0],
[0, 1, 0, 1, 1, 0],
[0, 0, 1, 1, 0, 0],
[0, 1, 0, 0, 1, 0],
[0, 1, 0, 1, 1, 0],
[0, 0, 0, 0, 0, 0]]