Python преобразовать список в матрицу зигзагом
Подскажите, пожалуйста, как можно преобразовать список в матрицу зигзагом? Есть код, который наоборот, преобразует матрицу в список зигзагом:
def zigzag(a):
m, n = a.shape
solution = [[] for i in range(m + n - 1)]
for i in range(m):
for j in range(n):
sum = i + j
value = a[i][j]
index = (i, j)
if sum % 2 == 0:
solution[sum].insert(0, (value, index))
else:
solution[sum].append((value, index))
output_vector = []
for i in solution:
for j in i:
output_vector.append(j[0])
return output_vector
Ответы (1 шт):
Автор решения: Amgarak
→ Ссылка
Да я даже не понимаю, с какой стороны подойти к решению... Из списка, который возвращает функция zigzag нужно получить матрицу
Такой вопрос - вот вы вернули список, а как вы предлагаете по одному лишь списку понять какой размерности делать матрицу?
Вот допустим у нас список 9 элементов.. Это матрица 3х3 или 9х1?!
Если zigzag() будет возвращать еще и размеры исходной матрицы или мы сами их будем устанавливать для создания матрицы, то вопрос вполне решаем:
import numpy as np
def zigzag(a):
m, n = a.shape
solution = [[] for i in range(m + n - 1)]
for i in range(m):
for j in range(n):
sum = i + j
value = a[i][j]
if sum % 2 == 0:
solution[sum].insert(0, value)
else:
solution[sum].append(value)
output_vector = []
for i in solution:
output_vector.extend(i)
return output_vector, m, n
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
result_lst, m, n = zigzag(a)
print(result_lst)
print(m, n) # Размеры матрицы
def list_zigzag_to_matrix(lst, m, n):
a = np.zeros((m, n), dtype=int)
solution = [[] for i in range(m + n - 1)]
for i in range(m):
for j in range(n):
sum = i + j
if sum % 2 == 0:
solution[sum].insert(0, (i, j))
else:
solution[sum].append((i, j))
index = 0
for d in solution:
for i, j in d:
a[i][j] = lst[index]
index += 1
return a
result_matrix = list_zigzag_to_matrix(result_lst, m, n)
print(result_matrix)
Вывод:
[1, 2, 4, 7, 5, 3, 6, 8, 9]
3 3
[[1 2 3]
[4 5 6]
[7 8 9]]
[Program finished]