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]
→ Ссылка