Как отсортировать элементы каждого столбца массива без использования numpy и pandas?

Задание звучит так:

"Отсортировать элементы каждого столбца двумерного массива чисел (n х m) по не убыванию значений элементов."

import random
n, m = 3, 3
A = [[random.randint(0, 10) for j in range(m)] for i in range(n)]

У меня есть несколько потенциально верных вариантов решения, но все они не рабочие(

1.

for j in range(m):
    for i in range(n):
        if A[i][j] > A[i + 1][j]:
            A[i][j], A[i + 1][j] = A[i + 1][j], A[i][j]

2

Через транспонирование => sort/sorted

trasnpA = list(zip(*A))
for i in range(3):
    sorted(A[i])
print(trasnpA)
print(list(zip(*trasnpA)))

3

Через sort/sorted c ключом


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

Автор решения: Павел

Тут действительно проще всего решать через транспонирование.

import random

A = [[random.randint(0, 10) for j in range(4)] for i in range(4)]

A_transposed = list(zip(*A))

A_transposed_sorted = [sorted(row) for row in A_transposed]

A_sorted = [list(x) for x in list(zip(*A_transposed_sorted))]

print(A) # [[9, 2, 2, 4], [9, 6, 5, 0], [4, 10, 0, 5], [9, 6, 3, 0]]

print(A_sorted) # [[4, 2, 0, 0], [9, 6, 2, 0], [9, 6, 3, 4], [9, 10, 5, 5]]

Или в одну строчку

A_sorted = [list(x) for x in list(zip(*[sorted(row) for row in list(zip(*A))]))]

введите сюда описание изображения

→ Ссылка
Автор решения: Valentin Kolesnikov
import random
n, m = 3, 3
A = [[random.randint(0, 10) for j in range(m)] for i in range(n)]

def matrix_column_sort(matrix):
    transpose_matrix = [list(row) for row in zip(*matrix)]
    sorted_transpose_matrix = list(map(sorted, transpose_matrix))
    sorted_matrix = [list(row) for row in zip(*sorted_transpose_matrix)]
    return sorted_matrix

print(A)
print(matrix_column_sort(A))
→ Ссылка