Размещение списков в других списках - PullRequest
0 голосов
/ 08 декабря 2018

Я хотел бы скопировать один список в другой:

list1= 
[[0,0,1,0,0],
 [0,1,0,0,0],
 [0,1,0,0,0],
 [0,1,0,0,0],
 [0,1,0,0,0]]
list2=
 [[2,2],
  [2,0],
  [2,0]]

Если вы посмотрите на него, список два выглядит как тетрис "L".Моя цель состоит в том, чтобы скопировать эту часть "L" в список 1 таким образом, чтобы часть изменила список 1, написав 2 на месте детали.Таким образом, list1 после копирования будет выглядеть так:

list1= 
[[2,2,1,0,0],
 [2,1,0,0,0],
 [2,1,0,0,0],
 [0,1,0,0,0],
 [0,1,0,0,0]]

ИЛИ

list1= 
[[0,0,1,0,0],
 [0,1,0,0,0],
 [0,1,2,2,0],
 [0,1,2,0,0],
 [0,1,2,0,0]]

ETC.

Поскольку мне нужно разместить больше частей (только одно решение, как головоломка)), Я думал об использовании рекурсивной функции.

list1= [[0,0,0,0],
        [0,0,0,0],
        [0,0,1,0]],
list2= [[2,2],
        [2,0]],
list3= [[3,3],
        [3,0],
        [3,0]]
list4= [[4,4],
        [0,4],
        [0,4]]

Список 1 должен выглядеть следующим образом:

list1= [[3,3,4,4],
        [3,2,2,4],
        [3,2,1,4]]

ЭТО НЕОБХОДИМО РАБОТАТЬ АВТОМАТИЧЕСКИ.Есть идеи?

1 Ответ

0 голосов
/ 08 декабря 2018

Попробуйте следующим образом (разрушительно для list1):

dx, dy = 0, 0
for x, sub2 in enumerate(list2):
  for y, e in enumerate(sub2):
    if e != 0: list1[x+dx][y+dy] = e

dx и dy дает вам сдвиг, заботится о пределе индекса .

Чтобы увидеть вывод, dx, dy = 2, 2:

for line in list1:
  print (line)

# [0, 0, 1, 0, 0]
# [0, 1, 0, 0, 0]
# [0, 1, 2, 2, 0]
# [0, 1, 2, 0, 0]
# [0, 1, 2, 0, 0]


Чтобы повторно использовать код, определите метод:
def move(matrix, piece, dx=0, dy=0):
  for x, line in enumerate(piece):
    for y, e in enumerate(line):
      if e != 0: matrix[x+dx][y+dy] = e
  return matrix

Затем вызовите в зависимости от ваших шагов:

list1= [[0,0,0,0], [0,0,0,0], [0,0,1,0]]
list2= [[2,2], [2,0]]
list3= [[3,3], [3,0], [3,0]]
list4= [[4,4],[0,4],[0,4]]

move(list1, list2, 1, 1)
move(list1, list3)
move(list1, list4, 0, 2)

Окончательный результат после звонков:

for line in list1:
  print (line)

# [3, 3, 4, 4]
# [3, 2, 2, 4]
# [3, 2, 1, 4]
...