Сортировка матрицы по сумме столбцов
Напишите программу, которая переставляет столбцы матрицы так, чтобы они шли в порядке убывания суммы элементов столбцов (сначала – столбец с наибольшей суммой). Столбцы, у которых одинаковая сумма элементов, должны быть выведены в том же порядке, в котором они стояли в исходной матрице.
Входные данные В первой строке записаны через пробел размеры матрицы: количество строк N и количество столбцов M ( 1 ≤ N , M ≤ 100 ). В следующих N строках записаны строки матрицы, в каждой – по M натуральных чисел, разделённых пробелами.
Выходные данные Программа должна вывести получившуюся матрицу, в которой столбцы переставлены так, чтобы они шли в порядке убывания суммы элементов столбцов (сначала – столбец с наибольшей суммой).
Примеры входные данные
4 5
21 12 23 24 55
26 12 28 39 43
11 27 21 14 39
16 17 18 35 20
выходные данные
55 24 23 21 12
43 39 28 26 12
39 14 21 11 27
20 35 18 16 17
Вот код:
def sortmatrix(matrix):
length, width = len(matrix[0]), len(matrix)
dup = [item for sub in matrix for item in sub]
dup = sorted(dup)
i = 0
new_list = [dup[i:i+length] for i in range(len(dup)) if i %length == 0]
return new_list
z=sortmatrix([[21, 12 ,23, 24,55], [26 ,12 ,28 ,39 ,43], [11, 27, 21 ,14, 39],])
print(z)
Ответы (2 шт):
Пробуйте
row, col = [int(num) for num in input().split()]
matrix = []
for i in range(row):
matrix.append([int(num) for num in input().split()])
def get_col_sum(matrix, index, rows):
res = 0
for i in range(rows):
res = res + matrix[i][index]
return res
def swap_col(matrix, rows, index1, index2):
for i in range(rows):
matrix[i][index1], matrix[i][index2] = matrix[i][index2], matrix[i][index1]
for i in range(col):
for j in range(0, col - i - 1):
if get_col_sum(matrix, j, row) < get_col_sum(matrix, j + 1, row):
swap_col(matrix, row, j, j + 1)
for i in range(row):
print(matrix[i])
Если транспонировать матрицу (превратить столбцы в строки), то можно пользоваться встроенными методами для выполнения данной задачи:
вспомогательная функция для транспонирования матрицы:
def transpose(mat):
return list(map(list, zip(*mat)))
решение:
res = transpose(sorted(transpose(m), key=lambda x: sum(x), reverse=True))
результат:
[[55, 24, 23, 21, 12],
[43, 39, 28, 26, 12],
[39, 14, 21, 11, 27],
[20, 35, 18, 16, 17]]