Сортировка матрицы по сумме столбцов

Напишите программу, которая переставляет столбцы матрицы так, чтобы они шли в порядке убывания суммы элементов столбцов (сначала – столбец с наибольшей суммой). Столбцы, у которых одинаковая сумма элементов, должны быть выведены в том же порядке, в котором они стояли в исходной матрице.

Входные данные В первой строке записаны через пробел размеры матрицы: количество строк 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 шт):

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

Пробуйте

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])

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

Если транспонировать матрицу (превратить столбцы в строки), то можно пользоваться встроенными методами для выполнения данной задачи:

вспомогательная функция для транспонирования матрицы:

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