Добавление дополнения к 2D-массиву в Python

#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]]