Сортировка матрицы
Дана матрица 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 шт):
Во второй части вашей программы (и частично и в первой) вы усложняете себе жизнь.
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.
Любое разумное решение будет следовать образцу: перевести матрицу в список, упорядочить список, расставить числа из списка в элементы матрицы. Но на Питоне есть пара трюков которые облегчают задачу.
Собрать матрицу можно в одну строку. Получится не список, а генератор:
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
----------