Помогите решить задачу по сортировке матрицы на python

Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствий с ростом характеристик. Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент.

Вот мой код:

import random as r

print("Введите количество столбцов:")
n = int(input())
print("Введите количество строк:")
m = int(input())
summ = 0
max_sum = 0

a = [[r.randint(-10, 3) for j in range(n)] for jj in range(m)]
for g in range(len(a)):
    for h in range(len(a[g])):
        print(a[g][h], end=" ")
    print()


def sum_otr(list, m, numb_col):
    s = 0
    for i in range(m):
        if list[i][numb_col] < 0:
            s += list[i][numb_col]
    return s


def counter(list, kol_col, numb_col):
    summ = 0
    for i in range(kol_col):
        if list[i][numb_col] < 0 and list[i][numb_col] % 3 == 0:
            summ += abs(list[i][numb_col])

    return summ


res_arr = []

for nk in range(n):
    res_arr.append(counter(a, m, nk))
    re = counter(a, m, nk)
    print("\n", "Сумма отрицательных элементов по столбцам:", sum_otr(a, m, nk))
    if re > max_sum:
        max_sum = re
print("\n", res_arr)

for j in range(n):
    mmin = j
    i = j + 1
    for i in range(n):
        if res_arr[i] < res_arr[mmin]:
            mmin = i
            buf_sum = res_arr[j]
            res_arr[j] = res_arr[mmin]
            res_arr[mmin] = buf_sum
            for ii in range(m):
                buf_a = a[ii][j]
                a[ii][j] = a[i][mmin]
                a[i][mmin] = buf_a

for g in range(len(a)):
    for h in range(len(a[g])):
        print(a[g][h], end=" ")
    print()

Почему матрица не изменяется?


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

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

Такой код должен решить эту задачу:

import random as r

def main():
    n = 3#int(input("Введите количество столбцов:"))
    m = 3#int(input("Введите количество строк:"))
    a = [[r.randint(-10, 3) for j in range(n)] for jj in range(m)]

    print('Начальная матрица: ')
    output_matrix(a)
    
    par = [[col, characteristic(a, col)] for col in range(n)] # [[idx столбца, характеристика], ...]
    q = [x[0] for x in sorted(par, key=lambda x: x[1])] # порядок расстановки

    new_matrix = [[0]*n for i in range(m)]
    new_col = 0
    for col in q:
        for row in range(m):
            new_matrix[row][new_col] = a[row][col]
        new_col += 1
    print('Преобразованная матрица: ')
    output_matrix(new_matrix)

    print('Характеристики столбцов:')
    for x in par:
        print(x[1], end=' ')
    print()

    print('Суммы отрицательных элементов по столбцам:')
    for col in range(n):
        print(sum_neg(new_matrix, col), end=' ')
    print()    

def output_matrix(matrix):
    for row in matrix:
        for el in row:
            print(el, end=' ')
        print()
    print()

def characteristic(matrix, col):
    s = 0
    for i in range(len(matrix)):
        n = matrix[i][col]
        if (n < 0) and (n % 2): # число <0 и нечетное
            s += abs(n)
    return s

def sum_neg(matrix, col):
    s = 0
    for i in range(len(matrix)):
        n = matrix[i][col]
        if n < 0:
            s += n
    return s

main()
→ Ссылка