Python矩阵排序求助:添加列和行并按列和升序排序
矩阵列和追加与按列和排序实现方案
问题场景
已通过以下代码生成MxM随机矩阵:
from random import randrange matrix_size = int(input("Enter size of the matrix: ")) matrix = [[randrange(1, 51) for column in range(matrix_size)] for row in range(matrix_size)]
需要完成两个需求:
- 计算各列的和,将其作为一行追加到矩阵末尾;
- 按照列和的升序对矩阵的列进行排序。
完整解决方案代码
from random import randrange # 1. 生成MxM随机矩阵 matrix_size = int(input("Enter size of the matrix: ")) matrix = [[randrange(1, 51) for column in range(matrix_size)] for row in range(matrix_size)] # 2. 计算所有列的和并追加为矩阵最后一行 column_sums = [] for col_idx in range(matrix_size): sum_col = 0 for row_idx in range(matrix_size): sum_col += matrix[row_idx][col_idx] column_sums.append(sum_col) matrix.append(column_sums) # 3. 按列和升序对列排序 # 转置矩阵:将原列转换为行,方便按列和排序 transposed_matrix = list(zip(*matrix)) # 以转置后每行的最后一个元素(即原列的和)为关键字升序排序 sorted_transposed = sorted(transposed_matrix, key=lambda x: x[-1]) # 再次转置恢复原矩阵结构,并转换为列表嵌套列表 sorted_matrix = [list(row) for row in zip(*sorted_transposed)] # 4. 格式化打印结果 for row in sorted_matrix: for num in row: print(f'{num:>5}', end='') print()
代码说明
计算列和并追加:
- 循环遍历每一列索引,累加该列所有行的元素值,得到每列的和并存储到
column_sums列表; - 通过
matrix.append(column_sums)将列和作为新行添加到矩阵末尾。
- 循环遍历每一列索引,累加该列所有行的元素值,得到每列的和并存储到
按列和排序列:
- 利用
zip(*matrix)转置矩阵,原矩阵的列会变成转置后的行,此时转置后每行的最后一个元素就是对应原列的和; - 使用
sorted函数,通过lambda x: x[-1]指定排序关键字为转置后每行的最后一个元素(即列和),实现升序排序; - 再次转置排序后的矩阵,恢复原矩阵的行-列结构,并将zip返回的元组转换为列表,保证矩阵结构一致。
- 利用
示例输出
输入矩阵尺寸5时,输出类似:
Enter size of the matrix: 5 14 22 15 20 23 74 26 27 7 27 26 113 9 13 17 42 36 117 41 2 1 29 32 105 14 49 33 12 43 151 104 113 73 130 160 580
(注:最后一行为排序后的列和,列的顺序按列和从小到大排列)
内容的提问来源于stack exchange,提问作者Hans_Landa
相关产品推荐
相关产品推荐

