Сортировка матрицы

Дана матрица n * m , нужно отсортировать и вывести колонками от самого маленького к самому большому, у меня не выходит сделать, смотреть ниже.

Мой код:

n , m = map(int,input().split())
matrix = [list(map(int,input().split())) for i in range(n)]
matrix_copy = copy.deepcopy(matrix)
li = []
for i in range(n):
    for j in range(m):
        li.append(matrix[i][j])
li.sort()
k = -1
for i in range(n):
    for j in range(m):
        k +=1
        matrix_copy[i][j] = li[k]

x = (list(zip(*matrix_copy)))

for i in x:
    print(*i)

Вход: n - количество строк, m- количество колонок, потом вводим матрицу нужного размера.

Как работает у меня:

input:

3 3
4 1 3
2 5 7
9 8 6

output:

1 4 7
2 5 8
3 6 9

input:
1 3
4 2 1
output:
1
2
4

input:
3 1
9
7
8

output:

7 8 9

Как должно быть:

input0:

3 3
4 1 3
2 5 7
9 8 6

output0:

1 4 7
2 5 8
3 6 9

input1:
1 3
4 2 1

output1:
1 2 4

input2:
3 1
9
7
8
output2:
7
8
9

Ответы (2 шт):

Автор решения: MarianD

Во второй части вашей программы (и частично и в первой) вы усложняете себе жизнь.

n, m = map(int,input().split())
matrix = [list(map(int,input().split())) for i in range(n)]
li = []
for i in range(n):
    for j in range(m):
        li.append(matrix[i][j])
li.sort()

# ------- дотуда (почти) ваш код, теперь мой --------

for i in range(n):
    for j in range(m):
        print(li[n * j + i], end=" ")
    print()

n * j + i просто индекс i-той строки и j-того столбца в вашем списке li.

→ Ссылка
Автор решения: Stanislav Volodarskiy

Любое разумное решение будет следовать образцу: перевести матрицу в список, упорядочить список, расставить числа из списка в элементы матрицы. Но на Питоне есть пара трюков которые облегчают задачу.

Собрать матрицу можно в одну строку. Получится не список, а генератор:

itertools.chain.from_iterable(matrix)

Функция sorted принимает вход в том числе и генераторы, возвращает список.

Собрать матрицу из списка тоже можно в одну строку с помощью слайсов:

[lst[i::n] for i in range(n)]

Код целиком:

import itertools


def sorted_by_columns(matrix):
    n = len(matrix)
    lst = sorted(itertools.chain.from_iterable(matrix))
    return [lst[i::n] for i in range(n)]


def print_matrix(matrix):
    for r in matrix:
        print(*r)


def check(matrix):
    print('-' * 10)
    print_matrix(matrix)
    print('-')
    print_matrix(sorted_by_columns(matrix))
    print('-' * 10)


check([
    [4, 1, 3],
    [2, 5, 7],
    [9, 8, 6]
])
check([
    [4, 2, 1]
])
check([
    [9],
    [7],
    [8]
])

Результаты:

----------
4 1 3
2 5 7
9 8 6
-
1 4 7
2 5 8
3 6 9
----------
----------
4 2 1
-
1 2 4
----------
----------
9
7
8
-
7
8
9
----------
→ Ссылка